zoukankan      html  css  js  c++  java
  • leetcode 51. N-Queens 、52. N-Queens II

     51. N-Queens

    使用isValid判断当前的位置是否合法

    每次遍历一行,使用queenCol记录之前行的存储位置,一方面是用于判断合法,另一方面可以根据存储结果输出最终的结果

    棋盘的斜线都是45°的,所以两个位置x的差值和y的差值应该是相等的

    class Solution {
    public:
        vector<vector<string> > solveNQueens(int n) {
            vector<vector<string> > result;
            if(n <= 0)
                return result;
            vector<int> queenCol(n,-1);
            int curRow = 0;
            solveNQueens(curRow,result,queenCol,n);
            return result;
        }
        
        void solveNQueens(int curRow,vector<vector<string> >& result,vector<int>& queenCol,int n){
            if(curRow == n){
                vector<string> res(n,string(n,'.'));
                for(int i = 0;i < n;i++)
                    res[i][queenCol[i]] = 'Q';
                result.push_back(res);
                return;
            }
            for(int i = 0;i < n;i++){
                if(isValid(queenCol,curRow,i)){
                    queenCol[curRow] = i;
                    solveNQueens(curRow + 1,result,queenCol,n);
                    queenCol[curRow] = -1;
                }
            }
        }
        
        bool isValid(vector<int> queenCol,int row,int col){
            for(int i = 0;i < row;i++){
                if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
                    return false;
            }
            return true;
        }
    }; 

    52. N-Queens II

    这个题更像是51题的简化版,51题需要把所有的可能性输出出来,这个题只需要输出不同的个数。代码基本和51题差不多,依旧使用dfs遍历就好。

    注意:result加了引用! curRow没加引用!

             result最终要作为返回值获得结果,所有的搜索情况都公用这个result,但是curRow,不同的搜索,搜索的值应该不一样

    class Solution {
    public:
        int totalNQueens(int n) {
            if(n <= 0)
                return 0;
            vector<int> queenCol(n,-1);
            int result = 0;
            int curRow = 0;
            totalNQueens(n,queenCol,result,curRow);
            return result;
        }
        void totalNQueens(int n,vector<int>& queenCol,int& result,int curRow){
            if(curRow == n){
                result++;
                return;
            }
            for(int i = 0;i < n;i++){
                if(isValid(queenCol,curRow,i)){
                    queenCol[curRow] = i;
                    totalNQueens(n,queenCol,result,curRow+1);
                    queenCol[curRow] = -1;
                }
            }
        }
        
        bool isValid(vector<int>& queenCol,int row,int col){
            for(int i = 0;i < row;i++){
                if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
                    return false;
            }
            return true;
        }
    };

    另一种写法:

    这种写法也是正确的,将queenCol的引用去掉,然后将queenCol[curRow] = -1;删掉,因为实际上不会回调回来。

    如果你想用回调回来的,就必须queenCol[curRow] = -1

    如果不用回调,其实queenCol[curRow] = -1这句话删掉不删掉都是正确的,因为不影响原来调用的函数中queenCol的结果。

    class Solution {
    public:
        int totalNQueens(int n) {
            if(n <= 0)
                return 0;
            vector<int> queenCol(n,-1);
            int result = 0;
            int curRow = 0;
            totalNQueens(n,queenCol,result,curRow);
            return result;
        }
        void totalNQueens(int n,vector<int> queenCol,int& result,int curRow){
            if(curRow == n){
                result++;
                return;
            }
            for(int i = 0;i < n;i++){
                if(isValid(queenCol,curRow,i)){
                    queenCol[curRow] = i;
                    totalNQueens(n,queenCol,result,curRow+1);
                    //queenCol[curRow] = -1;
                }
            }
        }
        
        bool isValid(vector<int>& queenCol,int row,int col){
            for(int i = 0;i < row;i++){
                if(queenCol[i] == col || abs(row - i) == abs(col - queenCol[i]))
                    return false;
            }
            return true;
        }
    };
  • 相关阅读:
    void类型和void *指针类型(网上摘抄总结)【转】
    微信小程序中的canvas基础应用
    Google Interview University 一套完整的学习手册帮助自己准备 Google 的面试
    git使用教程(详细)
    Vue下载依赖遇到的一些bug
    原生Javascript客户端表单验证
    ASP MVC 后台控制器弹出框提示
    网页URLJs传值传值传值传值传值问题
    从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
    弹出提示框,在跳转
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10697445.html
Copyright © 2011-2022 走看看