問題描述:
八皇后問題(eight queens problem)是十九世紀著名的數學家高斯於1850年提出的。問題是:在8×8的棋盤上擺放八個皇后,使其不能互相攻擊。即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
可以把八皇后問題擴展到n皇后問題,即在n×n的棋盤上擺放n個皇后,使任意兩個皇后都不能互相攻擊。
思路:
使用回溯法依次假設皇后的位置,當第一個皇后確定后,尋找下一行的皇后位置,當滿足左上、右上和正上方向無皇后,即矩陣中對應位置都為0,則可以確定皇后位置,依次判斷下一行的皇后位置。當到達第8行時,說明八個皇后安置完畢。
代碼如下:
#include<iostream>
using namespace std;
#define N 8
int a[N][N];
int count=0;
//判斷是否可放
bool search(int r,int c)
{
int i,j;
//左上+正上
for(i=r,j=c; i>=0 && j>=0; i--,j--)
{
if(a[i][j] || a[i][c])
{
return false;
}
}
//右上
for(i=r,j=c; i>=0 && j<N; i--,j++)
{
if(a[i][j])
{
return false;
}
}
return true;
}
//輸出
void print()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
//回溯法查找適合的放法
void queen(int r)
{
if(r == 8)
{
count++;
cout<<"第"<<count<<"種放法\n";
print();
cout<<endl;
return;
}
int i;
for(i=0; i<N; i++)
{
if(search(r,i))
{
a[r][i] = 1;
queen(r+1);
a[r][i] = 0;
}
}
}
//入口
int main()
{
queen(0);
cout<<"一共有"<<count<<"放法\n";
return 0;
}