八皇后的一个回溯递归解法
解法来自严蔚敏的数据结构与算法。
代码如下:
#include <iostream>
using namespace std;
const int N = 8;//皇后数
int count = 0;//解法统计
int a[N][N];//储存值的数组const char *YES = "■";
const char *NO = "□";
//const char *YES = "●";
//const char *NO = "○";//打印一个结果。
void printOneResult(){cout<<"------------第"<<count<<"种----------"<<endl;for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){if(a[i][j] == 1){cout<<YES<<" ";}else{cout<<NO<<" ";}}cout<<endl;}cout<<"-----------end-------------"<<endl;
}//放棋子
void put(int i, int j){a[i][j] = 1;
}//拿走棋子
void remove(int i, int j){a[i][j] = 0;
}//参数是否合法
bool isParameterValid(int parameter){if(parameter < 0 || parameter > N - 1)return false;return true;
}//判断,本次放的棋子是否符合题目要求。
bool isValid(int i, int j){if(a[i][j] != 1 || !isParameterValid(i) || !isParameterValid(j)){cout<<"isValid中,传入参数错误!"<<endl;return false;} for(int k = 1; k <= i ; k++){if (isParameterValid(i - k) && ((a[i - k][j] != 0) ||(isParameterValid(j - k) && a[i - k][j - k] != 0) ||(isParameterValid(j + k) && a[i - k][j + k] != 0))){return false;}}return true;
}//递归函数。
void Trial(int i, int n){//i表示第i行,n表示最大行数。if(i > n){//i > n表示,找到了一个正确结果。:)count++;printOneResult();}else{for(int j = 0; j <= n; j++){//走到这里说明。前i-1行都已经是正确的放法了,这次尝试第i行。put(i, j);//第i行第j个也就是a[i][j]放上棋子if(isValid(i, j)){//棋子合法Trial(i + 1, n);//进行下一个判断。}remove(i, j);//不管棋子合法不合法,这一位都已经尝试过了所有可能,所以remove掉,开始第j + 1的循环。}}}int main(){ Trial(0, 7);return 0;
}
这个好像不算长。思路也还算清晰,这应该是最容易想到的八皇后解法了吧。
八皇后的一个回溯递归解法相关推荐
- 八皇后问题的非递归解法
用C++实现了八皇后问题的非递归算法.原理很简单,看代码就是了,无须多说 #include <cmath>#include <iostream>#include <vec ...
- 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...
- 八皇后问题(回溯法amp;枚举法)
作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表 ...
- 算法:递归-八皇后问题(回溯算法)
1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...
- 递归-八皇后问题(回溯算法)
一:八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个 ...
- 从八皇后问题思考回溯法
一.八皇后问题 八皇后是经典的回溯法问题,题目是说将八个皇后,放到8×8的国际象棋棋盘中中,使得任意两个皇后都不能在同一行.同一列以及同一条对角线上.下图是一个四皇后的搜索示意图. 八皇后问题可以通过 ...
- 迷宫(栈、队列、递归3种方法)和八皇后(栈和递归2种方法)的C/C++描述(上)
***迷宫: 栈是只能在一端进行添加元素和删除元素的表,分顺序栈和链式栈.程序里变量命名应该长一些,做到见名知意.提高程序阅读性.本文用栈的方法存储路径中每一步,栈中每个元素是结构体变量,包含每一步的 ...
- 算法分析与设计-八皇后问题(回溯法)
回溯法: 回溯的意义是在递归直到可解的最小问题后,逐步返回原问题的过程,而这里所说的回溯算法实际上是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...
- 算法总结——八皇后问题(三种解法)
问题描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...
最新文章
- 【建议收藏】复盘:2021年最新、最全、最实用的Android岗学习资料/面试真题
- Python写入到csv文件存在空行的解决方法
- Windows 技术篇 - windows日期和时间设置里没有Internet 时间页签原因和解决方法
- 【Quartz.net】- Cron表达式
- 3月25日 编译的四个过程
- 在使用vue-video-player时,切换页面浏览器报错:TypeError: this.el_.vjs_getProperty is not a function**
- 联发科MT6763处理器参数MT6763处理器芯片资料下载
- 大数据之实时流处理常用框架
- 素数筛普通筛法全解(C/C++)
- 华为牛人的十年工作感悟
- 什么是股票交易api接口?
- web前端进阶<7>:3d图像翻转效果
- 【CVPR2020】3D目标检测论文汇总
- 移相信号发生器 课程设计 电赛 正弦波发生 相位调节
- java公路车等级_CANNONATA康纳塔 JAVA发布2016款终极赛车
- 主题:风电-光热-CHP联合发电系统优化调度
- 【Vue项目笔记心得】Swiper插件用于轮播图
- 【FI】SAP标准成本计算和发布
- 2021年 秋招面试记录
- 协同过滤算法深入解析:构建智能推荐系统的核心技术