件名の説明:
戻り値の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;
}
};