DFS搜索题素数环

素数环:

输入整数1,2,3,4,5,···,n组成一个环,使得相邻两个整数之和均为素数。

输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n<=16.

Sample:

input:

6

output:

1 4 3 2 5 6

1 6 5 2 3 4

使用DFS搜索解释:素数环的第一个数为1,则选定第一个数为1,然后向下遍历所有数据,能够和前面一个数据组合相加成为素数的数就被数组记录下来。

知道判断到最后一个数字,然后检查它和第一个数相加是否为素数,若是就输出数组中记录的答案,不是就从头开始。

代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=100;
 5 int vis[N],ans[N];
 6 int n;
 7 bool flag;
 8 bool is_prime(int x)//判断两个数据相加是否为素数
 9 {
10     for(int i=2;i*i<=x;i++)
11     if(x%i==0)return false;
12     return true;
13 }
14 void dfs(int cur)
15 {
16     if(cur==n+1)
17     {
18         if(is_prime(ans[n]+ans[1]))
19         {
20             for(int i=1;i<=n;i++)
21             {
22                 if(i>1)cout<<" ";
23                 cout<<ans[i];
24             }
25                 cout<<endl;
26         }
27         return;
28     }
29     for(int i=2;i<=n;i++)
30     {
31         if(!vis[i]&&is_prime(ans[cur-1]+i))
32         {
33             vis[i]=1;
34             ans[cur]=i;
35             dfs(cur+1);
36             vis[i]=0;
37         }
38     }
39     return;
40 }
41 int main()
42 {
43     while(cin>>n)
44     {
45         flag=false;
46         memset(vis,0,sizeof(vis));
47         ans[1]=1;
48         dfs(2);//第一个数已经固定为1,就从2开始搜索
49     }
50     return 0;
51 }

DFS搜索题素数环

时间: 2024-07-31 15:16:11

DFS搜索题素数环的相关文章

rwkj 1422搜索(素数环)

  算法分析与设计:搜索(素数环) 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:178            测试通过:35 描述 将1-n这n个数摆成一个环,要求相邻的两个数的和是一个素数,编程输出所有可能的解. 输入 包括多组数据,每组1个数n.n<20 输出 所有可能的解. 输出格式见样例. 样例输入 6 8 样例输出 Case 1: 1 4 3 2 5 6 1 6 5 2 3 4Case 2: 1 2 3 8 5 

hdu1455 dfs搜索之凑棍子

原题地址 这道题和poj的拯救少林神棍是一样的题目. 要用给出的小棍凑成等长的棍子,求能凑成的棍子的最小长度. 直观的包里思路就是枚举所有可能的长度,然后不停的测试小棍组合,先把小棍加入组合,然后不合适就推翻这一根小棍,再测试下一个小棍,直到推翻所有的小棍. 在枚举的时候,我们只需从最长的小棍长,枚举到小棍总长的一半就行了.然后如果再不符合的话,那么就说明所有小棍只能组合成一根棍子了. 我原先看过关于poj上拯救少林神棍这道题目的详细讲解.一个DFS搜索题,这里DFS共有四种剪枝方案: 所给出的

nyoj素数环(dfs)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

搜索与回溯 - 素数环

[题目描述] 从1到20,这20个数摆成一个环,要求相邻的两个数的和是一个素数.求所有可能. [算法分析&&参考代码] 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int a[21],ans=0; //a数组表示第几个位置的数是啥. 5 bool b[21]={0}; //b数组表示标记,这个数用过没有? 6 bool pd(int,int); 7 void dfs(int);

HDU-1016【素数环】

题意:本题题意就是构成一个素数环.即相邻两数之和要为素数.环的元素个数在1到20之间. 素数-只能被1和它本身整除的数 输入6就是1-6排成一个相邻数相加是素数:环,第一个和最后一个加起来也要是素数 Sample Input 6 8 Sample Output Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 /*su shu huan*/

Prime Ring Problem 经典素数环

Prime Ring Problem A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1.

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

经典搜索题

今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id=1011 刚开始接触搜索的初学者面对这道题可能感觉无从下手,即便是告诉了要用深搜解决这道题,也不知道怎么用,我现在也对搜索有了更多的理解与体会,其实不要把搜索只理解为在一个地图上找点,其实搜索更可以抽象为当面对多个选择的时候如何抉择,深搜就是先认准一个方向走下去,不行再回来,走别的路:广搜就是把每

关于10月12日#2的四道搜索题的心得与感悟

今天上午开始写姜神的搜索题. 第一道,经典八数码,重新复习康托展开与BFS.代码写得太弱,外加对题理解不充分,调了一上午的码. 第二题,八数码变种,数据更水,把握住翻转的扩展规律即可. 第三题,还在施工 第四题,一开始DFS暴力,TLE掉;后来开始用DFS记忆化搜索,失败;接着尝试BFS+DP,TLE掉.最后在网上看了题解,利用DP解决. 在DP的过程中要留意边界.另外状态转移的时候很容易写出模模糊糊的错误转移.在这题中,先处理好一排或一列,在逐层或逐列转移,可以避免重复计算导致的超时. 第四题