MOOC清华《程序设计基础》第5章:八皇后问题-代码二
2017-07-10 18:33
399 查看
代码二是清华大学出版社《程序设计基础》(第三版)中清华大学吴文虎老师的算法,从每一行来尝试放棋子。
与代码一一样,代码二的结果也是92种解法。
![](https://img-blog.csdn.net/20170710183245589)
![](https://img-blog.csdn.net/20170710183255184)
//问题描述: //在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种解法。
相关文章推荐
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- MOOC清华《程序设计基础》第5章:分书问题-代码一
- MOOC清华《程序设计基础》第5章:分书问题-代码二
- MOOC清华《程序设计基础》第5章:N皇后问题(带矩阵输出)
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法二)
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法一)
- MOOC清华《程序设计基础》第5章第4题:用递归算法实现选择排序
- MOOC清华《程序设计基础》第6章:橱窗插花问题(递推法)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(枚举法)
- MOOC清华《程序设计基础》第6章:三种递推方法求兔子数列问题(斐波那契数列)
- MOOC清华《程序设计基础》第6章第2题:求f(a,b)问题(动态规划)
- MOOC清华《程序设计基础》第5章:数字旋转方阵的填充-算法二
- MOOC清华《程序设计基础》第5章第2题:破损棋盘的八皇后问题
- MOOC清华《程序设计基础》第5章:快速排序(分配动态空间)
- MOOC清华《程序设计基础》第2章第5题:银行存款问题2
- MOOC清华《程序设计基础》第5章:求n的阶乘(用递推法做)
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法三)
- MOOC清华《程序设计基础》第5章第1题:判断数列的对称性