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

来源:互联网 发布:gbic端口 编辑:程序博客网 时间:2024/06/16 21:35

代码一是MOOC版视频中清华大学徐明星老师的算法,从每列尝试放棋子。

//问题描述://在8×8的棋盘上,放置8个皇后,使两两之间互不攻击。所谓互不攻击是指://(1)不在棋盘的同一行;//(2)不在棋盘的同一列;//(3)不在棋盘的同一对角线上。#include <iostream> using namespace std;const int Normalize = 9;  //用来统一数组下标int Num;  //方案数int q[9];  //8个皇后所占用的行号 bool S[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 col){//递归终止条件:所有列均已放上皇后了if(col == 9){Num++;cout << "方案" << Num <<":";for(int k = 1; k <= 8; k++)cout << q[k] << " ";cout << endl;return;} //依次尝试当前的8行位置for(int row = 1; row <= 8; row++){//判断拟放置皇后的位置是否安全if(S[row] && L[col - row + Normalize] && R[col + row]){//记录位置信息(行号)q[col] = row;//修改三个方向的安全性标记S[row] = false;L[col - row + Normalize] = false;R[col + row] = false;//核心技巧其实在后面这两行里,只有这样调整,对角线的下标才//统一地从2到16,两个方向的平行对角线都是15条 //递归尝试放下一列Try(col + 1);//回溯:恢复三个方向原有安全性S[row] = true;L[col - row + Normalize] = true; R[col + row] = true;} } } int main(){Num = 0;for(int i = 0; i < 9; i++)S[i] = true;for(int i = 0; i < 17; i++){L[i] = true;R[i] = true;}Try(1);  //从第1列开始放皇后return 0; }

结果共有92种解法:





阅读全文
0 0