hdoj--1016<dfs>

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

题目描述:1~n的整数排成一个环,首尾相连,相邻的两个数相加是素数,输出满足的排列,1开头输出,字典序;

题目要点:dfs

本题安顺序dfs,可以满足字典序,对于每一个要放进去的数要考察两个,一、是否放过了。二、是否和前面相邻的数构成素数;

所以第一,开一个数组,记录该数是否被放过;第二,写一个判断素数的函数;

代码如下:

(当只有一个元素的时候比较特殊,要考虑到)

 1 #include<stdio.h>
 2 #include<string.h>
 3 int n,b[25],a[25],t=1;//b数组用来放数;a数组用来记录;
 4 int prime(int x)
 5 {
 6         for(int i=2;i<x;i++)
 7         {
 8             if(x%i==0)
 9                 return 0;
10         }
11         return 1;
12 }
13 void dfs(int cur)//cur记录的是这一次放大色是第几个数;
14 {
15     if(cur>n)   //注意这里一直放到第n+1个,然后比较1和b【n】是否是素数;
16     {
17         if(prime(1+b[n])){
18          printf("%d",b[1]);
19          for(int i=2;i<=n;i++)
20          {
21              printf(" %d",b[i]);
22          }
23          printf("\n");
24         }
25     }
26     else
27     {
28         for(int i=2;i<=n;i++)
29         {
30             if(a[i]==0&&prime(i+b[cur-1]))
31             {
32                 b[cur]=i;a[i]=i;
33                 dfs(cur+1);a[i]=0;
34             }
35
36         }
37     }
38 }
39 int main()
40 {
41     while(scanf("%d",&n)!=EOF)
42     {
43         printf("Case %d:\n",t++);
44         memset(a,0,sizeof(a));
45         b[1]=1;//一开头是固定的,直接赋值就好了。
46         if(n==1)//如果只有一个数,算是符合要求直接输出就好;
47         {
48             printf("1\n\n");
49             continue;
50         }
51         dfs(2);//从2开始dfs
52         printf("\n");
53     }
54     return 0;
55 }

时间: 2024-10-31 01:19:32

hdoj--1016<dfs>的相关文章

hdoj 1016 Prime Ring Problem 【DFS】

策略如题 链接 http://acm.hdu.edu.cn/showproblem.php?pid=1016 代码: #include<stdio.h> #include<string.h> int prime[25] = {1, 1}, n, vis[25]; //vis作用:标记是否用过 int a[25]; void f() //找出来前20的素数 判定为0 { for(int i = 2; i <= 24; i ++){ if(prime[i] == 0) for(i

hdoj - 1258 Sum It Up &amp;&amp; hdoj - 1016 Prime Ring Problem (简单dfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1258 关键点就是一次递归里面一样的数字只能选一次. 1 #include <cstdio> 2 #include <cstring> 3 4 int n,t; 5 int b[15],c[15]; 6 bool flag; 7 void dfs(int k,int sum,int l) 8 { 9 if(sum==t) 10 { 11 for(int i=0;i<l-1;i++) 12 p

HDOJ 4582 - DFS spanning tree - DFS树,贪心

题目大意: 给定一个N个点.M条边的无向图Graph,以及从点1开始进行DFS形成的树Tree,定义"T-Simple Circle"为Graph中的环,要求其中只含一条不属于Tree的边. 将Graph中的一些边进行染色,使得其中每个T-simple Circle都至少包含一条被染色的边,求最少需要染色的边数. N≤2e3,M≤2e4 本题关键的一点在于Tree是一棵DFS生成树,这样Tree以外的边只可能将某个点与它在Tree中的祖先相连(用反证法可以证明,只有这样才能维持DFS树

hdu 1016 dfs素数环

背景:周赛e题,当时很快就有人出,我能看出来是dfs但是却不能实现,哎以为自己能力不可写出,结果低估自己了. 学习:1.打了一个素数表,比较快捷,还有素数判别方法的函数,只需要枚举到该数的平方根即可,因为大于它的平方·根之后商都小于1,不可能再整除了. int isPrime(int x) { int i; for (i = 2; i <= sqrt(x*1.0); i++)//sqrt函数操作的是double. { if (x % i == 0) return 0; } return 1; }

HDU 1016 DFS

很简单的深搜 只要看出来是深搜... 注意判断最后一点是否与加一为质数 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> using namespace std; int n; int ans[30]; bool vis[30]; bool ok[105]; void init()///素数打表 { memset(ok,t

[HDU]1016 DFS入门题

题目的意思就是在1到n的所有序列之间,找出所有相邻的数相加是素数的序列.Ps:题目是环,所以头和尾也要算哦~ 典型的dfs,然后剪枝. 这题目有意思的就是用java跑回在tle的边缘,第一次提交就tle了(服务器负载的问题吧),一模一样的第二次提交就ac了,侧面也反应了递归对stack的开销影响效率也是严重的.好了,上代码!! 题目传送门: HDU_1016 import java.util.Scanner; public class Main { public static final int

HDOJ 1427(dfs) 速算24点

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不需要选择出最短的路径,采用dfs更有效: 拓展状态时,从当前状态拥有的数中选取两个进行某种运算(因为两个数之间存在大小关系,所以对于除法与减法来说,运算顺序一定, 大的数为被减数或被除数:加法与乘法具有交换律,相对顺序没有影响),如果可以进行运算且运算结果满足题目要求,则该状态可以 拓展,如此拓展状

hdoj 1016 Prime Ring Problem

Problem Description 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

hdoj 2212 DFS 【水】

DFS Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5298    Accepted Submission(s): 3252 Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every digit

hdu 1016 dfs+素数表打表

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. Input n (0 < n <