n 皇后问题 研究的是如何将 n
个皇后放置在 n × n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回 n 皇后问题 不同的解决方案的数量。
思路一:回溯
int check(int* queens,int row,int col){
for(int i=0;i<row;i++){
if(queens[i]==col || abs(queens[i]-col)==abs(i-row)){
return 0;
}
}
return 1;
}
void solve(int * queens,int row,int n,int* count){
if(row==n){
(*count)++;
return;
}
for (int col=0;col<n;col++){
if(check(queens,row,col)){
queens[row]=col;
solve(queens,row+1,n,count);
queens[row]=-1;//回溯
}
}
}
int totalNQueens(int n){
int*queens=(int*)malloc(sizeof(int)* n);
for(int i=0; i<n;i++){
queens[i]=-1;
}
int count=0;
solve(queens,0,n,&count);
free(queens);
return count;
}
分析:
本题为51题简化版,只需将解决方法的个数给出即可。与上题一样通过判断皇后列行左上斜线是否有皇后确定此次排列是否可行,回溯得出方法的总数,最后输出答案
总结:
本题考察回溯算法的应用,考虑两个皇后之间不符合题意的情况后回溯即可得出答案。