主对角线 i+j 次对角线 n+i-j
最近学递归回溯..来做做例题.
以前做这题是倒着搜的,下面的代码是正着搜。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define N 20 using namespace std; int n,cnt; int ans[N],col[N],c[N*2],d[N*2]; void queen(int now) { if(now==n+1) { if(cnt<=2) { for(int i=1;i<=n;i++) { cout<<ans[i]<<" "; } cnt++; cout<<endl; }else cnt++; return ; } for(int i=1;i<=n;i++) { if(!col[i]&&!c[now+i]&&!d[n+now-i]) { col[i]=c[now+i]=d[n+now-i]=1; ans[now]=i; queen(now+1); col[i]=c[now+i]=d[n+now-i]=0; } } } int main() { scanf("%d",&n); queen(1); cout<<cnt<<endl; return 0; }