ACM:回溯,八皇后问题,素数环
(一)八皇后问题
(1)回溯
#include <iostream>
#include <string>#define MAXN 100using namespace std;int tot = 0, n = 8;
int C[MAXN];void search(int cur) {if(cur == n) ++tot; //递归边界,仅仅要走到了这里。全部皇后必定不冲突else for(int i = 0; i < n; ++i) {int ok = 1;C[cur] = i; //尝试把第cur行的皇后放在第i列for(int j = 0; j < cur; ++j) { //检查是否和前面的皇后冲突if(C[cur] == C[j] || cur-C[cur] == j-C[j] || cur+C[cur] == j+C[j]) {ok = 0;break;}}if(ok) search(cur+1); //假设合法,则继续递归}
}int main() {search(0);cout << tot << endl;return 0;
}
(2)利用二维数组优化的回溯法
#include <iostream>
#include <string>#define MAXN 100using namespace std;int tot = 0, n = 8;
int vis[3][MAXN], C[MAXN]; void search(int cur) {if(cur == n) ++tot;else for(int i = 0; i < n; ++i) {if(!vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n]) { //利用二维数组直接推断C[cur] = i;vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1; //改动全局变量search(cur+1);vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0; //这里一定要改回来!}}
}int main() {memset(vis, 0, sizeof(vis));search(0);cout << tot << endl;return 0;
}
在上面的程序中,vis数组表示已经放置的皇后占领了哪些列、主对角线和副对角线。
一般的在回溯法中,假设改动了全局变量vis数组,那么递归调用结束后一定要改动回来!由于在解答树中,假设下一层不满足条件,那么就须要回溯。那么就要把改动过的vis给改回来,那样,才干继续进行下一次的推断!!!
(二)素数环
题目:输入正整数n,把整数1。2,3,...,n组成一个环。使得相邻两个整数之和均为素数。
输出时从整数1開始逆时针排列。
同一个环应该恰好输出一次。
典型的回溯法,代码例如以下:
#include <iostream>
#include <algorithm>
using namespace std;const int MAXN = 1000;
int isp[MAXN], vis[MAXN], A[MAXN], n;int is_prime(int x) { //推断一个数是否为素数for(int i = 2; i*i <= x; ++i) {if(x % i == 0) return 0;}return 1;
}void dfs(int cur) {if(cur == n && isp[A[0] + A[n-1]]) {for(int i = 0; i < n; ++i) cout << A[i] << " ";cout << endl;}else {for(int i = 2; i <= n; ++i) {if(!vis[i] && isp[i + A[cur-1]]) {A[cur] = i; //数字i满足条件,所以第cur个位置能够放数字ivis[i] = 1;dfs(cur+1);vis[i] = 0; //跟上题一样。一定不能忘记把vis的值改回来,原因见上一题的代码凝视}}}
}int main() {memset(vis, 0, sizeof(vis)); //递归调用之前,一定要把vis函数清0cin >> n;for(int i = 2; i <= 2*n; ++i) isp[i] = is_prime(i); //推断一个数不是质数。为了方便后推断A[0] = 1; //从标题中的规定的第一个数字1开始dfs(1); //所以递归调用位置的1开始,而不是从位置0开始,因为数字第一位置已被确定是1return 0;
}
ACM:回溯,八皇后问题,素数环相关推荐
- 回溯算法 | 追忆那些年曾难倒我们的八皇后问题
文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...
- 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...
- 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里插入图片描述 第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对 ...
- 递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...
- 十二、八皇后问题(递归回溯)
一.八皇后问题介绍 (本次使用回溯算法解决,之后会用贪心算法优化) 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行. 同一列或同一斜线上,问有多少种摆法(9 ...
- 递归回溯解决八皇后问题
文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...
- 回溯算法(八皇后问题)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)
回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...
- 七十八、 回溯法解决八皇后问题
@Author:Runsen 八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后. 来自百度百科,皇后的走法是可 ...
最新文章
- 使用pip安装特定的软件包版本
- 系统架构设计师视频教程免费下载
- DotNET多线程使用初探
- 云原生ASP.NET Core程序的可监测性和可观察性
- 线程间通信————互斥
- pandas:根据行间差值进行数据合并
- 深入理解计算机系统第四版_深入理解计算机系统之存储器层次结构
- WinForm C#全局错误捕捉处理【整理】
- 布局网页表格要求其列平均分布的简单操作
- 面向对象程序设计中“超类”和“子类”概念的来历
- 《Spring Boot官方指南》28.安全
- Liunx/Unix scp命令详解(转)
- php显示上一次登陆的时间长,cookie实现显示上次登录时间的问题
- 《ANSYS Workbench有限元分析实例详解(静力学)》——第1章 CAE分析步骤1.1 模型简化...
- vue + element插件 首次运行白屏原因分析
- 微信 php收藏功能实现,基于WordPress的微信JSSDK之分享与收藏的回调解决方案 - YangJunwei...
- JAVA基础案例教程——模拟物流快递系统程序设计
- UI/UE设计学习路线图(超详细)
- 在阿里云CentOS 7.4下安装WSTMart开源商城系统
- 如何在PS中将一张图片一次性裁剪保存成多张图片
热门文章
- Apache Spark1.1.0部署与开发环境搭建 - Mark Lin
- uni-app官方教程学习手记
- 一个对复用view下滑动流畅度优化,图片和内存处理,稳定性都非常强大的android开源框架(beyondPhysics)...
- 整合百度UEditor上传图片到阿里云OSS
- 异数OS 2017 DPDK 峰会观后感
- jqurey datatables属性
- 深入学习 History 对象管理浏览器会话历史
- Mac OSX:Powerline风格的zsh配置
- Linux下的Vsftpd配置篇
- silverlight for olap version milestone 07 updated!