c++实现八皇后问题(详细注释)

17 篇文章 0 订阅
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值