具体怎么做的,还不是很清楚,大致就是遇到不符合的返回到上一个符合条件的时候,还有,要进行预处理,不然会TLE
#include<iostream>
using namespace std;
int n,num[11],flag[11],d,sum;
void dfs(int x){
if(x == n)
sum++;
else{
for(int i = 0;i<n;i++){
d = 1;
flag[x] = i;
for(int j = 0;j<x;j++){
if(flag[j]+j == flag[x]+x || flag[j]-j == flag[x]-x || flag[j] == flag[x]){
d = 0;
break;
}
}
if(d) dfs(x+1);
}
}
}
int main(){
for(n = 1;n<=10;n++){
sum = 0;
dfs(0);
num[n] = sum;
}
while(scanf("%d",&n),n){
printf("%d\n",num[n]);
}
return 0;
}