这题要打表,不然超时。
AC代码
#include<cstdio>
#include<cstring>
int n,cnt;
int vis[3][20];
int ans[11];
void dfs(int i){ //以行递增
if(i==n){
++cnt;
return;
}
for(int j=0;j<n;++j){ //尝试放入第列
if(!vis[0][j]&&!vis[1][i+j]&&!vis[2][i-j+n]){
vis[0][j]=vis[1][i+j]=vis[2][i-j+n]=1;
dfs(i+1);
vis[0][j]=vis[1][i+j]=vis[2][i-j+n]=0;
}
}
}
int main(){
for(n=1;n<=10;++n){
cnt=0;
memset(vis,0,sizeof(vis));
dfs(0);
ans[n]=cnt;
}
while(scanf("%d",&n)==1&&n){
printf("%d\n",ans[n]);
}
return 0;
}
如有不当之处欢迎指出!