您的位置:首页 > 编程语言

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

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

//问题描述:
//在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种解法。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐