n皇后问题
1.问题描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
2.解析
n个皇后放在n*n的棋盘上,则每行都必须有一个皇后。
从上到下依次尝试放置皇后,对于每一行,从左到右依次尝试。如果当前位置可放置,则完成本行放置,进行下一行皇后的放置;如果遍历完本行,则进行回溯,返回上一行的皇后放置。
3.代码
class Solution {
int totalSolve = 0;
int QueueNum=0;
vector<vector<int>> chess;
public:
int totalNQueens(int n) {
QueueNum = n;
chess = vector<vector<int>> (n,vector<int>(n));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
chess[i][j] = 0;
setQueue(0);
return totalSolve;
}
void setQueue(int x){
if(x >= QueueNum){
totalSolve ++;
return;
}
for(int y =0 ; y<QueueNum;y++){
//判断当前位置否放置,如果能够放置,则放
if(judge(x,y)){
chess[x][y] = 1;
//下一行
setQueue(x+1);
chess[x][y] = 0 ;
}
}
}
bool judge(int x, int y){
bool flag = true;
int temp1=y,temp3=y;
while(--x>=0){
if(x>=0){
temp1--;
temp3++;
if(temp1>=0 && chess[x][temp1]==1){
flag = false;
break;
}
if(chess[x][y]==1){
flag = false;
break;
}
if(temp3<QueueNum && chess[x][temp3] == 1){
flag = false;
break;
}
}
}
return flag;
}
};
4.leetcode运行结果