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
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- MOOC清华《程序设计基础》第5章:八皇后问题-代码二
- MOOC清华《程序设计基础》第5章第2题:破损棋盘的八皇后问题
- MOOC清华《程序设计基础》第5章:分书问题-代码一
- MOOC清华《程序设计基础》第5章:N皇后问题(带矩阵输出)
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第5章:分书问题-代码二
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法一)
- MOOC清华《程序设计基础》第1章第5题:银行存款问题
- MOOC清华《程序设计基础》第2章第5题:银行存款问题2
- MOOC清华《程序设计基础》第5章:归并排序
- MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法一)
- MOOC清华《程序设计基础》第5章:数字旋转方阵的填充-算法一
- MOOC清华《程序设计基础》第6章第1题:n级台阶问题(递推法)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- MOOC清华《程序设计基础》第4章:折半插入排序(测试代码版)
- MOOC清华《程序设计基础》第4章:筛法求素数
- flask 蓝图
- Vue-router2.0版本的使用
- 【Linux】中UDP_server的实现
- 003
- Java学习之路--计算圆形的面积和周长
- MOOC清华《程序设计基础》第5章:八皇后问题-代码一
- ios-设置UISearchBar输入框的颜色等属性
- Android中关于签名的一些知识
- 支持向量机
- JSP_strut2架构下前台接收后台传递到前台之数据并处理以使用的一种方法
- ios AudioUnit bluetooth 录音 播放 实现
- 二维指针*(void **)的研究(uC/OS-II案例)
- 【JZOJ5219】【GDOI2018模拟7.10】B
- bzoj3687 简单题 bitset