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

来源:互联网 发布:卡饭 知乎 编辑:程序博客网 时间:2024/06/07 13:59

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

//问题描述://在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
原创粉丝点击