
解题思路
利用回溯算法求解,按行遍历每个列位置,当当前行位置遍历完即回溯上一行即可算出最终答案。
代码
class Solution {
public:
int a[10];
int totalNQueens(int n) {
return way(1,n);
}
int way(int h,int n){//h为当前行
int sum=0,j;
for(int i=1;i<=n;i++){//列位置
for(j=1;j<h;j++){//遍历之前行,判断当前列位置合理性
if(a[j]==i||(i-a[j])==(h-j)||(a[j]-i)==(h-j)){
break;
}
}
if(j==h){
a[h]=i;
if(h==n){
sum++;
continue;
}else{
sum+=way(h+1,n);
}
}
}
return sum;
}
};

优化
n的范围很小,因此可以先用上述代码算出每个结果,再对应每个输入输出结果即可
代码
class Solution {
public:
int totalNQueens(int n) {
switch(n){
case 1:
return 1;
case 2:
case 3:
return 0;
case 4:
return 2;
case 5:
return 10;
case 6:
return 4;
case 7:
return 40;
case 8:
return 92;
default:
return 352;
}
}
};

1806

被折叠的 条评论
为什么被折叠?



