MOOC清华《程序设计基础》第5章:八皇后问题-代码二

代码二是清华大学出版社《程序设计基础》(第三版)中清华大学吴文虎老师的算法,从每一行来尝试放棋子。

//问题描述:
//在8×8的棋盘上,放置8个皇后,使两两之间互不攻击。所谓互不攻击是指:
//(1)不在棋盘的同一行;
//(2)不在棋盘的同一列;
//(3)不在棋盘的同一对角线上。

#include <iostream> 
using namespace std;

const int Normalize = 9;  //用来统一数组下标

int Num;  //方案数
int q[9];  //8个皇后所占用的行号 

bool C[9];  //S[1]~S[8],当前列是否安全
bool L[17];  //L[2]~L[16],(i - j)对角线是否安全
bool R[17];  //R[2]~R[16],(i + j)对角线是否安全

void Try(int row)
{
	for(int col = 1; col <= 8; col++)
	//依次尝试当前的8列位置
	{
		//判断拟放置皇后的位置是否安全
		if(C[col] && L[row - col + Normalize] && R[row + col])
		{
			//记录位置信息(行号)
			q[row] = col;
			
			//修改三个方向的安全性标记
			C[col] = false;
			L[row - col + Normalize] = false;
			R[row + col] = false;
			//核心技巧其实在后面这两行里,只有这样调整,对角线的下标才
			//统一地从2到16,两个方向的平行对角线都是15条 
			
			if(row < 8)
			{
				//递归尝试放下一行
				Try(row + 1);
			}
			else
			{
				Num++;
				cout << "方案" << Num << ":";
				for(int k = 1; k <= 8; k++)
					cout << q[k] << " ";
				cout << endl;	
			}
			
			//回溯:恢复三个方向原有安全性
			C[col] = true;
			L[row - col + Normalize] = true; 
			R[row + col] = true;
		} 
	} 
} 

int main()
{
	Num = 0;
	for(int i = 0; i < 9; i++)
		C[i] = true;
	for(int i = 0; i < 17; i++)
	{
		L[i] = true;
		R[i] = true;
	}
	Try(1);  //从第1行开始放皇后
	return 0; 
}

与代码一一样,代码二的结果也是92种解法。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值