1213:八皇后問題
阿新 • • 發佈:2019-01-30
題目:
在國際象棋棋盤上放置八個皇后,要求每兩個皇后之間不能直接吃掉對方
無輸入
輸出:
按給定順序和格式輸出所有八皇后問題的解(見樣例)。
輸出樣例:
No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ...以下省略 |
程式碼:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define N 201 using namespace std; int a[N][N],b[N]; int vis[N][N]; int s; int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; void dfs(int step) { if(step==8+1) { s++; for(int i=1; i<=8; i++) a[s][i]=b[i]; return; } for(int i=1; i<=8; i++) { if(vis[0][i]==0&&vis[1][step+i]==0&&vis[2][step-i+8]==0) { vis[0][i]=1; vis[1][i+step]=1; vis[2][step-i+8]=1; b[step]=i; dfs(step+1); vis[0][i]=0; vis[1][i+step]=0; vis[2][step-i+8]=0; } } } int main() { dfs(1); for(int t=1; t<=s; t++) { printf("No. %d\n",t); for(int i=1; i<=8; i++) { for(int j=1; j<=8; j++) { if(a[t][j]==i) cout<<"1 "; else cout<<"0 "; } cout<<endl; } } return 0; }