#include <iostream>
using namespace std;
int c[20];
int n,tot;
void search(int cur){
int i,j;
if(cur == n) tot++; //递归边界,只要走到这里,所有皇后必然不会冲突
else for(i=0;i<n;i++){
int ok = 1;
c[cur] = i; //尝试把第cur行的皇后放在第i列
for(j=0;j<cur;j++){ //检查是否与前面的皇后冲突
//开始这里想了挺久的,原来将行本身的情况也比较了
if(c[cur] == c[j] || cur-c[cur] == j-c[j] || cur+c[cur] == j+c[j] ){
ok = 0;break;
}
}
if(ok) search(cur+1); //如果合法,继续递归
}
}
int main(){
//int n;
while(cin>>n){
tot=0;
search(0);
cout<<tot<<endl;
}
return 0;
}
当然,这里节点数似乎不能再减少了,但是程序效率还是可以提高的,采用二维数组vis[2][]直接判断当前尝试的皇后所在列和主对角线和副主对角线是否有其他皇后。
切记:如果在回溯法中使用了辅助的全局变量,一定要及时把他们回复原状。