【題目描述】
在國際象棋棋盤上放置八個皇后,要求每兩個皇后之間不能直接吃掉對方。
【輸入】
(無)
【輸出】
按給定順序和格式輸出所有八皇后問題的解(見樣例)。
【輸入樣例】
(無)
【輸出樣例】
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
…以下省略
題目分析:
這個題最大的令人惱怒的地方就是按列輸出了,一開始怎麼都沒法按它所示的順序輸出棋盤!
我們可以先建立一個二維數組a來儲存棋盤的不同類型,再建立一個一維數組b[i]表示第i列有沒有被佔用(即擺放了皇后)。設立c[i+j]和d[i-j+7]數組表示對角線有沒有被佔。(+7是爲了防止數組下標編程負數)
然後再從擺放第一個皇后開始搜索,擺完八個皇后就輸出或者遇到不能擺放的位置就返回上一步選擇新的擺放位置。
代碼:
#include<iostream>
#include<cmath>
using namespace std;
int sum=0;
int a[9][9];//儲存棋盤種類
int c[10],d[10];//分別控制兩條對角線
int b[10];//佔領第幾列。
void search(int);
void print();
int main()
{
search(1);
return 0;
}
void search(int i)
{
for(int j=1;j<=8;j++)
{
if(b[j]==0&&c[i+j]==0&&d[i-j+7]==0)
{
a[i][j]=1;
b[j]=1;
c[i+j]=1;
d[i-j+7]=1;
if(i==8) print();
else search(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+7]=0;
a[i][j]=0;
}
}
}
void print()
{
sum++;
cout<<"No. "<<sum<<endl;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
cout<<a[j][i]<<" ";//按列輸出
cout<<endl;
}
}
結果:
輸出:
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
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
No. 4
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
No. 5
0 0 0 0 0 1 0 0
1 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 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
No. 6
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 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 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 7
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 8
0 0 1 0 0 0 0 0
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
(以下省略)