(一)八皇后问题

(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:回溯,八皇后问题,素数环的更多相关文章

  1. 【Acm】八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 其解决办法和我以前发过的[算法之美—Fire Net:www.cnblogs.com/lcw/p/3159414.html]类似 题目:在8 ...

  2. HDU 1016 素数环(dfs + 回溯)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 一道很典型的dfs+回溯: 根据题意首先进行初始化,即第一个位置为1,然后进行dfs, ...

  3. 八皇后,回溯与递归(Python实现)

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

  4. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  5. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  6. 【Python】生成器、回溯和八皇后问题

    八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认 ...

  7. 八皇后問題 (C語言递归實現 回溯法)

    八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...

  8. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  9. js实现八皇后,回溯法

    八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...

随机推荐

  1. HttpSession具体解释

    session的机制 http是无状态的协议,客户每次读取web页面时,server都打开新的会话,并且server也不会自己主动维护客户的上下文信息,那么要怎么才干实现会话跟踪呢?session就是 ...

  2. Redis Destop Manager不能访问虚拟机

    虚拟机centOS中安装Redis,主机Redis Destop Manager不能访问虚拟机Redis server的解决方案 今天在学些redis的时候碰到个问题,发现主机Redis Destop ...

  3. linux kernel的函数与抽象层

    在数学领域,函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素. 在C语言中函数也有这种联系.自变量影响着因变量. 在linux内核驱动编程经常会有抽象层的概念 ...

  4. VCL改变主窗体的方法

    使用如下语句即可Pointer((@Application.MainForm)^) := Form1; 仔细想想和Pointer((Application.MainForm)) := Form1;有什 ...

  5. Redis最有用的中文资源,你值得拥有

    只是为了记录资源地址,最好直接访问doc.redisfans.com更美观 Redis 命令参考 本文档是 Redis Command Reference 和 Redis Documentation ...

  6. [半原创]指纹识别+谷歌图片识别技术之C++代码

    原地址:http://blog.csdn.net/guoming0000/article/details/8138223 以前看到一个http://topic.csdn.net/u/20120417/ ...

  7. M I S 开发与管理

    今天是开学的第一天,很意外的一天没课.但是我知道还有很多事情在等待这我,不能懈怠!安排好计划,把重要不紧急的事情逐渐蚕食掉,切不可养虎为患,等拖到它变成重要紧急事件后,那就后悔莫及了. 下午看了看自考 ...

  8. 启动和关闭JBoss As 7.1.1脚本

    启动和关闭JBoss As 7.1.1,脚本例如以下djboss.sh: #!/bin/sh #JBOSS_HOME JBOSS_HOME=/opt/jboss case "$1" ...

  9. Filter技术+职责链模式

    Filter是一个过滤器,存在Webclient与请求的资源之间.这里的资源能够说是jsp或servlet.它的作用就是在请求达到资源之前,先对请求进行预处理.而且也能够对servlet处理后的res ...

  10. hdu4389(数位dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意:f(x)表示x各位的数字和. 给定1<=L<=R<=10^9, 求[L, ...