Leetcode一般的な質問に答えると、分析要約し、集約--T52(N女王II)

件名の説明:

戻り値のnクイーン問題の解決の数。

トピック分析:

一見すると、T51の問題は、同じ問題であるが、問題はよりシンプル、チェス盤のために人々に伝えるための唯一の必要性のn *はn、ソリューションの総数は、解決策の具体的なリターンの特定の形になることはできません。

全て、決定されたが、時間のかかる操作モードビットの数の従来の解決策にこのソリューションはまた、解決するために使用することができます。

class Solution {
public:
    int totalNQueens(int n) {
        vector<string> board(n,string(n,'.'));      //棋盘
        vector<vector<string>> result;              //可行的棋盘
        backtrack(0,board,result);                  //进行回溯求所有可行解
        return result.size();                       //直接返回所有可行解的个数
    }
    
    void backtrack(int row,vector<string>& board,vector<vector<string>>& result)
    {
        if(row==board.size())result.push_back(board);
        else
        {
            for(int col=0;col<board[0].size();++col)
            {
                /*剪枝,避免无效皇后*/
                if(!isVaild(board,row,col))continue;
                /*choose过程:加入决策路径*/
                board[row][col]='Q';
                /*row+1选择列表变小,进入下一步选择*/
                backtrack(row+1,board,result);
                /*unchoose过程:回溯过程,在决策路径中去除决策*/
                board[row][col]='.';
            }
        }
    }
    
    bool isVaild(vector<string>& board,int row,int col)
    {
        //检查上方
        for(int i=0;i<row;++i)
            if(board[i][col]=='Q')return false;
        
        //检查右上方
        for(int i=row-1,j=col+1;i>=0&&j<board[0].size();i--,j++)
            if(board[i][j]=='Q')return false;
        
        //检查左上方
        for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
            if(board[i][j]=='Q')return false;
        
        //不用检查下方,因为下方还没有放置皇后
        return true;
    }
};

 

公開された56元の記事 ウォン称賛7 ビュー4468

おすすめ

転載: blog.csdn.net/weixin_44504987/article/details/104402596