问题描述:
八皇后问题(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<<"种放法
";
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<<"放法
";
return 0;
}