八皇后问题 (信息学奥赛一本通-T1213)
生活随笔
收集整理的這篇文章主要介紹了
八皇后问题 (信息学奥赛一本通-T1213)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
在國際象棋棋盤上放置八個皇后,要求每兩個皇后之間不能直接吃掉對方。
【輸入】
(無)
【輸出】
按給定順序和格式輸出所有八皇后問題的解(見樣例)。
【輸入樣例】
(無)
【輸出樣例】
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 100 using namespace std; int a[N][N],b[N]; int vis[N][N]; int tot; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; void dfs(int step) {if(step==8+1){tot++;for(int i=1;i<=8;i++)a[tot][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<=tot;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 ";elsecout<<"0 ";}cout<<endl;}}return 0; }?
總結
以上是生活随笔為你收集整理的八皇后问题 (信息学奥赛一本通-T1213)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Running(POJ-3661)
- 下一篇: 团伙(信息学奥赛一本通-T1385)