• 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;
        }
    };
  • 相关阅读:
    mySQL优化方案
    java之自动过滤提交文本中的html代码script代码
    java小技术之生成二维码
    微信扫码支付功能详细教程————Java
    java实现发送邮件服务器,SMTP协议发送邮件
    『重构--改善既有代码的设计』读书笔记----序
    Linux导航神器-----autojump
    绘图时,根据size()和自定义rect编程的区别
    Qt中如何在QCursor移动的时候不触发moveEvent
    Qt远程机开发时光标注意问题
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10697445.html
Copyright © 2020-2023  润新知