dfs一直往下搜索,每次chack一下是否满足要求,即可
代码如下:
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn=30; int vis[maxn];//记录每行点的纵坐标 int a[20]; int ans; int n,m; bool chack(int a,int b) { for(int i=1;i<a;i++) { if(vis[i]==b||abs(a-i)==abs(vis[i]-b))//判断与该行之前的点的纵坐标是否相等和45度角 return 0; } return 1; } void dfs(int x,int y) { if(x>m) { ans++; return; } for(int i=1;i<=m;i++) { if(chack(x,i)) { vis[x]=i; dfs(x+1,1); } } } int main() { for(int i=1;i<=10;i++) { m=i; ans=0; dfs(1,1); // printf("ans : %d\n",ans); a[i]=ans; } while(scanf("%d",&n)!=EOF) { if(!n) break; printf("%d\n",a[n]); } return 0; }