N 皇后问题
N 皇后问题
- 分析:根据题意,用dfs求解,在一个皇后放置后,他所在的列和两个对角线都要被标记,而他所在的行在占领后就不会再被遍历,在列和对角线都没有被标记时,证明这个位置可以放置皇后,就在这个位置放置皇后然后标记他的列和对角线,递归结束的标志是n个皇后放置完毕,输出n个皇后所在的列号。
-
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,sum=0; int a[51],b[51],c[51],d[51]; void dfs(int i) { if(i==n+1) { sum++; for(int j=1;j<=n;j++) printf("%5d",a[j]); cout<<endl; return; } for(int j=1;j<=n;j++)//遍历当前这个皇后存在的列 { if(b[j]==0&&c[j+i]==0&&d[i-j+n]==0) { a[i]=j; b[j]=1;//占领第i列 c[i+j]=1;//占领对角线 左下到右上 d[i-j+n]=1;//占领对角线 右左上到下 dfs(i+1); b[j]=0; c[i+j]=0; d[i-j+n]=0; } } } int main() { cin>>n; dfs(1); if(sum==0) cout<<"no solute!"; return 0; }