老问题,用到回溯法。对于每一个皇后,在每行每列都可以放,她事先不知道会不会和其他皇后产生冲突,如果有冲突的话,则换个地方,直到放的地方不和其她皇后产生冲突。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
const int MAX = 8;
int count;//统计有多少解
class Queen
{
private:
int Q[MAX];
public:
void PutQ(int i)//放置第i行皇后
{
for (int j = 0; j < MAX; j++)
{
if (i == MAX)//如果全部放完,则输出结果
{
count++;
cout<<"第"<<count<<"组解."<<endl;
Print();
return;
}
Q[i] = j;//放置皇后
if (Judge(i))//判断是否与之前放置的皇后有冲突
{
PutQ(i + 1);
}
}
}
void Print()
{
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
if (j == Q[i])
{
cout<<"Q ";
}
else
{
cout<<"O ";
}
}
cout<<endl;
}
cout<<endl;
}
int Judge(int i)
{
for (int j = 0; j < i; j++)
{
if (Q[i] == Q[j] || fabs(Q[i] - Q[j]) == i - j)//如果行列或对角有冲突的话则结束
{
return 0;
}
}
return 1;//没有冲突
}
};
int main()
{
Queen queen;
queen.PutQ(0);//从第一行开始放置
return 0;
}