N皇后问题 回溯非递归算法 C++实现2
运行结果

代码如下
#include <bits/stdc++.h>
using namespace std;
const int MAX = ;
const char *LINE32 = "--------------------------------";
const bool PRINT_DETAILS = false;
long long n, cnt = ;// n表示皇后数量,cnt表示方案数量
int vis[][*MAX+];
//v[0][]、v[1][]、v[2][]分别表示列、主对角线、副对角线是否存在皇后
// 为0时表示无皇后,非0则表示有,且v[0][4]=2表示第四列第二行存在皇后 void print() {
cout << LINE32 << endl;
cout << "第" << cnt << "个方案: " << endl;
for (int i = ; i <= n; i++) {
if (i != ) {
cout << ", ";
}
cout << "(" << vis[][i] << "," << i << ")";
}
cout << endl;
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
if (vis[][j] != i) {
cout << 'x';
} else {
cout << 'Q';
}
}
cout << endl;
}
} bool check(int row, int col) {// 检查是否可以在(row,col)这个坐标放置皇后
return !(vis[][col] || vis[][row-col+n] || vis[][row+col]);
}
void place(int x, int y, int *r2c) {// 在(x,y)的位置上放置皇后
vis[][y] = x;
vis[][x-y+n] = vis[][x+y] = ;
r2c[x] = y;
}
void remove(int x, int y) {// 移除(x,y)位置上的皇后
vis[][y] = vis[][x-y+n] = vis[][x+y] = ;
}
void solve(int n) {// 与非递归实现1的不同点在于,A.使用了vis[3][]加快了判断,B.回溯的具体操作是在vis[3][]上而不是r2c[]上
int r2c[n+];// 存放各行所放位置的列数,其实类似于递归实现1和非递归实现1中使用的queen[]
r2c[] = ;// 这里要初始化,否则最后要退出下面的循环时会数组越界,受影响的代码是63_42
int row = , col = ;
place(row, col, r2c);
row = ;//在(1,1)的位置上放置一个皇后,然后进入循环,开始寻找第二行放置的位置
while (row > ) {// row的值最后为0,因为所有情况都检查完时,第一行往上回溯,row值就为0
if (row > n) {
// 找到一个解,之后需要向上回溯:移除上一行的皇后,从上一行的下一列尝试放置皇后
cnt++;
if (PRINT_DETAILS) {
print();
}
row--;// row返回上一行
remove(row, r2c[row]);// 移除上一行中的皇后
col = r2c[row]+;// 此时的(row,col)为下一次尝试放置的位置
} else if (col > n) {
// 当前row行中的每一个位置都尝试并放置了,回溯
row--;
remove(row, r2c[row]);
col = r2c[row]+;
} else if (check(row, col)) {
// 找到一个符合的位置
place(row, col, r2c);// 放置皇后
row++;// 查找下一行放置的位置
col = ;// 并且是从第一列开始放置
} else {
// 这一列不符合,查找下一列
col++;
}
}
} int main() {
// input
cout << "输入皇后个数: ";
cin >> n;
// compute
clock_t begin = clock();
solve(n);
clock_t end = clock();
// output
cout << LINE32 << endl;
cout << n << "皇后问题一共有" << cnt << "种解决方案" << endl;
cout << LINE32 << endl;
cout << "回溯非递归算法实现2 解决" << n << "皇后问题耗时" << /*end-begin << "打点" <<*/(double)(end-begin)/CLOCKS_PER_SEC << "s" << endl;
return ;
}
// 14 3~5s
与回溯递归算法实现2对比
回溯递归算法实现2运行情况

回溯非递归算法实现2运行情况

非递归实现还是比递归实现慢一点,有点不符合预期。
N皇后问题 回溯非递归算法 C++实现2的更多相关文章
- 理解 Hanoi 汉诺塔非递归算法
汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...
- N个数全排列的非递归算法
//N个数全排列的非递归算法 #include"stdio.h" void swap(int &a, int &b) { int temp; temp = a; a ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- C# 递归与非递归算法与数学公式
1.递归 递归:程序调用自身的编程技巧称为递归(recursion). 优点是:代码简洁,易于理解. 缺点是:运行效率较低. 递归思想:把问题分解成规模更小,但和原问题有着相同解法的问题. 1)下面是 ...
- 汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法
非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的 ...
- 二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTree ...
- 【转】Java实现折半查找(二分查找)的递归和非递归算法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- N皇后问题--回溯法
1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每 ...
随机推荐
- SQL语句中,如何使用含有if....else...判断语句
在我们开发中,有时要对数据库中的数据按照条件进行查询,用到if else类似的语句进行判断,那么if else语句只有在存储过程,触发器之类的才有,但是要在sql上当满足某种条件上要取不同的字段值,刚 ...
- 记一次phpstudy应急响应
某日,销售接了一个电话,突然告诉我有个某单位服务器中了木马被黑,具体情况未知.由于客户那边比较急,于是我火速赶往客户现场.到现场,客户首先给我看了深信服防火墙拦截记录,显示内网三台机器被入侵.通过沟通 ...
- Android项目目录结构模板以及简单说明
1) src 文件 编写java代码的文件目录,遵循java的命名规范.分包 2) gen 文件 包含了android的资源文件的标识符,是不需要程序员维护,是自动添加的 3) asse ...
- python中使用openpyxl模块时报错: File is not a zip file
python中使用openpyxl模块时报错: File is not a zip file. 最大的原因就是不是真正的 xlsx文件, 如果是通过 库xlwt 新建的文件,或者是通过自己修改后缀名 ...
- 前端CSS学习笔记
一 CSS介绍 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(超文本标记语言)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以 ...
- 干货系列之java注解
干货系列之java注解 前言 java反射和注解在java里面很重要,但是很多人对这方面的知识理解不是很好,我来说说我自己对java反射和注解的理解,这两块内容本来应该出在一个博客文章里面讲解,但是由 ...
- OpenCV-Python Meanshift和Camshift | 四十七
学习目标 在本章中, 我们将学习用于跟踪视频中对象的Meanshift和Camshift算法. Meanshift Meanshift背后的直觉很简单,假设你有点的集合.(它可以是像素分布,例如直方图 ...
- coding++:Spring中的@Transactional(rollbackFor = Exception.class)属性详解
异常: 如下图所示,我们都知道 Exception 分为 运行时异常 RuntimeException 和 非运行时异常. error 是一定会回滚的. 如果不对运行时异常进行处理,那么出现运行时异常 ...
- C 最大公约数&最小公倍数
1.最大公约数 链接 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数.几个自然数公有的约数,叫做这几个自然数的公约数.公约数中最大的一个公约数,称为这几个自然数的最大公约数. 1 ...
- 关于《自动化测试实战宝典:Robot Framework + Python从小工到专家》
受新冠疫情影响,笔者被“困”在湖北老家七十余天,于4月1号(愚人节)这天,终于返回到广州.当前国内疫情基本已趋于平稳,但全球疫情整体势态仍在持续疯涨,累计确诊病例已近80万人.祈祷这场全球性灾难能尽早 ...