#include<iostream>
#include<string>
using namespace std;
class Queen
{
private:
int Place(int k); //判断皇后k是否冲突
int *x; //皇后的位置
int num; //皇后的个数
public:
Queen(int n); //构造函数
~Queen(); //析构函数
void Set_Queen(); //放入皇后
void Print_Queen(); //打印皇后的位置
};
//构造函数
Queen::Queen(int n):num(n)
{
x = new int[n];
for (int i = 0; i < this->num; i++)//初始化棋盘为-1
{
x[i] = -1;
}
}
//析构函数
Queen::~Queen()
{
delete[]x;
}
//判断皇后是否冲突
//考察皇后k放置在x[k]列是否发生冲突
int Queen::Place(int k)
{
for (int i = 0; i < k; i++)
{
//当两个皇后在 同一列 或者 同一条斜线 时会发生冲突(abs是求绝对值的函数)
if (x[i] == x[k] || abs(i - k) == abs(x[i] - x[k]))
{
return 1; //冲突!返回1
}
}
return 0; //不冲突, 返回0
}
//放入皇后
void Queen::Set_Queen()
{
int k = 0, count = 0; //k表示皇后的行标, x[k]表示皇后的列标,count表示解的个数
while (k >= 0) //当输出所有结果后,会从最后一行回溯到棋盘第一行的前一行,此时k==-1,退出循环
{
x[k]++;
//1.如果将要放置皇后的列标没有出界 且 与其他皇后发生冲突的话,皇后k继续往下一列遍历
while (x[k] < this->num && this->Place(k) == 1)
{
x[k]++;
}
//2.如果将要放置皇后的列标没有出界 且 行标已经到达棋盘最后一行,则输出其中一种结果
if (x[k] < this->num && k == this->num - 1)
{
cout << "第" << ++count << "个解是:\t";
this->Print_Queen();
}
//3.如果将要放置皇后的列表没有出界 且 行标还没有到达棋盘最后一行(即棋盘还没有摆满),跳转到下一行准备摆放下一个皇后
else if (x[k] < this->num && k < this->num - 1)
{
k = k + 1;
}
//4.如果列标出界,将当前行的皇后置为-1,回溯到上一行将皇后摆放到下一列
else
{
x[k--] = -1;
}
}
}
//打印皇后的位置
void Queen::Print_Queen()
{
for (int i = 0; i < this->num; i++)
{
cout << x[i] + 1 << "\t"; //数组下标从0开始,打印从1开始
}
cout << endl;
}
int main()
{
cout << "请输入想要摆放的皇后个数(n >= 4):";
int n;
cin >> n;
Queen q(n);
q.Set_Queen();
system("pause");
return 0;
}
c++实现八皇后问题(详细注释)
最新推荐文章于 2024-07-07 14:15:19 发布