代码二是清华大学出版社《程序设计基础》(第三版)中清华大学吴文虎老师的算法,从每一行来尝试放棋子。
//问题描述:
//在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种解法。