#include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; int book_col[maxn]; int n; bool judge(int r,int c)//能否放在r行c列判断 { if(book_col[c]==1) return false;//如果这列已经被占用,不行 for(int i=1;i<r;i++) { if(abs(c-vis_Q[i])==abs(r-i)) return false;//如果和前面已将摆放好的在同一个对角线上,也不行 } vis_Q[r]=c;//都不冲突,就让第r行标记为c,代表第r行的皇后放在c位置 return true; } void show_Q()//output { ans++; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(vis_Q[i]==j) cout<<"Q "; else cout<<". "; } cout<<endl; } cout<<"_______________"<<endl; } void dfs_Q(int r)//核心代码,递归搜索,dfs { if(r==n+1) show_Q(); for(int j=1;j<=n;j++) { if(judge(r,j)) { book_col[j]=1; dfs_Q(r+1); book_col[j]=0; } } return; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { memset(book_col,0,sizeof(book_col)); memset(vis_Q,0,sizeof(vis_Q)); vis_Q[1]=i; book_col[i]=1; dfs_Q(2); } cout<<ans<<endl;//解的数目 return 0; }
需要了解下西洋棋的基本规则。