ACM:回溯,八皇后问题,素数环
(一)八皇后问题
(1)回溯
#include <iostream>
#include <string> #define MAXN 100 using 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 100 using 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个位置能够放数字i
vis[i] = 1;
dfs(cur+1);
vis[i] = 0; //跟上题一样。一定不能忘记把vis的值改回来,原因见上一题的代码凝视
}
}
}
} int main() {
memset(vis, 0, sizeof(vis)); //递归调用之前,一定要把vis函数清0
cin >> n;
for(int i = 2; i <= 2*n; ++i) isp[i] = is_prime(i); //推断一个数不是质数。为了方便后推断
A[0] = 1; //从标题中的规定的第一个数字1开始
dfs(1); //所以递归调用位置的1开始,而不是从位置0开始,因为数字第一位置已被确定是1
return 0;
}
ACM:回溯,八皇后问题,素数环的更多相关文章
- 【Acm】八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 其解决办法和我以前发过的[算法之美—Fire Net:www.cnblogs.com/lcw/p/3159414.html]类似 题目:在8 ...
- HDU 1016 素数环(dfs + 回溯)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- 回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- 【Python】生成器、回溯和八皇后问题
八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认 ...
- 八皇后問題 (C語言递归實現 回溯法)
八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...
- 算法——八皇后问题(eight queen puzzle)之回溯法求解
八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...
- js实现八皇后,回溯法
八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...
随机推荐
- gap锁 对于unique index 和Ununique index
Session 1: mysql> select * from s100; +-----+------+------+ | sn | id | info | +-----+------+---- ...
- Hadoop 的常用组件一览
Hadoop 集群安装及原理:hdfs命令行操作:Java操作hdfs的常用API接口:动态添加删除数据节点. HBase 集群安装及原理:Hbase命令行操作:Java操作Hbase的常用API接口 ...
- java jquery 函数多參数传递
业务需求: 名次 伙伴 业绩 签单 面谈 每日目标 1 文彬 5100 6 10 查看目标 2 马红月 4550 4 6 查看目标 3 王刚 4100 3 9 查看目标 4 郭亚凯 3450 4 ...
- Python 新浪微博元素 (Word, Screen Name)词汇多样性
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: w ...
- c++(重载、覆盖、隐藏)
源地址:http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏 ...
- PAIP: Paradigms of Artificial Intelligence Programming
PAIP: Paradigms of Artificial Intelligence Programming PAIP: Paradigms of Artificial Intelligence Pr ...
- mfc 导出数据保存成excel和txt格式
最近做了一些东西,项目到了收尾的工作.不过这次我没有参与到控件机器的功能的那一部分,都是主管自己写的.不过,所有的控件重写都是由我来做的.还有数据库这一方面是我和主管共同完成的.不过还不错,主管写一部 ...
- [置顶] android开发之来电自动拒接并自动回复短信_上课模式app
上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...
- [Android学习笔记]RelativeLayout的使用
RelativeLayout是相对布局控件,在屏幕适配的时候非常有用,在此记录一些它的常用属性 第一类:属性值为true或falseandroid:layout_centerHrizontal ...
- JavaFX2: 鼠标拖动选择和Ctrl+Shift连续区间选择的ListView
JavaFX2的ListView中的多选没有提供鼠标拖动选择的功能,同时按下Ctrl和Shift后连续的区间选中也不支持,以下代码用于处理这两个问题,细节见代码注释: import com.sun.j ...