题目大意:
经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。
基本思路:
用一维数组存储,下标代表行,元素存储列的编号,在编程时只需比较列以及对角线是否符合规则即可,判断对角线是否符合规则时注意绝对值;下面是最简单的递归算法;
代码如下:
#include <iostream>using namespace std;
int c[20],n=8,cnt=0;
void print()
{
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
{
if(j == c[i]) cout<<"1 ";
else cout<<"0 ";
}
cout<<endl;
}
cout<<endl;
}
void search(int r)
{
if(r == n)
{
print();
++cnt;
return;
}
for(int i=0; i<n; ++i)//循环这一点要掌握
{
c[r] = i;//放在循环里保证第r+1个皇后尝试每一种可能;
int ok = 1;
for(int j=0; j<r; ++j)//判断跟之前的皇后是否有冲突;
if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r])
{
ok = 0;
break;
}
if(ok) search(r+1);
}
}
int main()
{
search(0);
cout<<cnt<<endl;
return 0;
}