HDU Prime Ring Problem _DFS

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 21
 5 #define sc(x) scanf("%d",&x)
 6 #define pf(x) printf("%d\n",x)
 7 #define PF(x) printf("%d ",x)
 8 #define P printf("\n")
 9 #define CL(x,y) memset(x, y, sizeof(x))
10 #define FOR(i,x,v) for(int i=x; i<=v; i++)
11 using namespace std;
12 int prime[12]= {3,5,7,11,13,17,19,23,29,31,37};
13 int n, arr[M], used[M];
14 void DFS(int i);
15 bool check(int x);
16 void print();
17 int main()
18 {
19     int k=1;
20     while(~sc(n))
21     {
22         CL(arr, 0);
23         CL(used, 0);
24         printf("Case %d:\n",k++);
25         arr[1]=1;
26         used[1]=1;
27         DFS(2);
28         P;
29     }
30     return 0;
31 }
32 bool check(int x)
33 {
34     for(int k = 0; k < 11; k++)
35         if(prime[k] == x)
36             return true;
37     return false;
38 }
39 void print()
40 {
41     FOR(i, 1, n-1)//for(int i=1; i<n; i++)
42     PF(arr[i]);
43     pf(arr[n]);
44 }
45 void DFS(int i)
46 {
47     if(i == n+1)
48         print();
49     else
50     {
51         FOR(j, 2, n)// for(int j = 2; j<= n; j++)
52         {
53             if(i == n)
54             {
55                 if(!used[j] && check(j + arr[i-1]) && check(j + arr[1]))
56                 {
57                     used[j] = 1;
58                     arr[i] = j;
59                     DFS(i+1);
60                     used[j] = 0;
61                 }
62             }
63             else
64             {
65                 if(!used[j] && check(j + arr[i-1]))
66                 {
67                     used[j] = 1;
68                     arr[i] = j;
69                     DFS(i+1);
70                     used[j] = 0;
71                 }
72             }
73         }
74     }
75 }

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #define sc(x) scanf("%d",&x)
 6 #define pf(x) printf("%d\n",x)
 7 #define PF(x) printf("%d",x)
 8 #define CL(x,y) memset(x,y,sizeof(x))
 9 using namespace std;
10 int prime[12]= {3,5,7,11,13,17,19,23,29,31,37};
11 const int MAX = 20;
12 int n;
13 int arr[MAX], used[MAX];
14 void DFS(int num);
15 bool check(int x);
16 int main()
17 {
18     int k = 1;
19     while(sc(n)!=EOF)
20     {
21         printf("Case %d:\n", k++);
22         CL(used, 0);
23         CL(arr, 0);
24         arr[1] = 1;
25         used[1] = 1;
26         DFS(2);
27         cout << endl;
28     }
29     return 0;
30 }
31 void DFS(int num)
32 {
33     if(num > n)
34     {
35         for(int i = 1; i <= n; i++)
36         {
37             printf("%d", arr[i]);
38             if(i < n) printf(" ");
39         }
40         cout << endl;
41     }
42     else
43         for(int j = 2; j <= n; j++)
44         {
45             if(num <= n-1)
46             {
47                 if((arr[num-1]+j)&1 && !used[j] && check(arr[num-1]+j))
48                 {
49                     used[j] = 1;
50                     arr[num] = j;
51                     DFS(num+1);
52                     used[j] = 0;
53                 }
54             }
55             else
56             {
57                 if((arr[num-1]+j)&1 && !used[j] && check(j+arr[1]) && check(arr[num-1]+j))
58                 {
59                     used[j] = 1;
60                     arr[num] = j;
61                     DFS(num+1);
62                     used[j] = 0;
63                 }
64             }
65         }
66 }
67 bool check(int x)
68 {
69     int j;
70     for(j = 3; j * j <= x; j++)
71     {
72         if(x % j == 0)
73             return false;
74     }
75     return true;
76 }
77 //bool check(int x)
78 //{
79 //    for(int k = 0; k < 11; k++)
80 //        if(prime[k] == x)
81 //            return true;
82 //    return false;
83 //}

时间: 2024-08-05 21:10:21

HDU Prime Ring Problem _DFS的相关文章

HDU Prime Ring Problem (DFS+素数打表)

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

hdu Prime Ring Problem

简单的dfs,貌似这道题用暴力枚举就可以了,毕竟数据开的是比较小的. #include"iostream" #include"algorithm" #include"stdio.h" #include"string.h" #include"string" #include"vector" #include"cmath" #define mx 105 using nam

HDU 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

HDU 1016 Prime Ring Problem --- 经典DFS

思路:第一个数填1,以后每个数判断该数和前一个数想加是否为素数,是则填,然后标记,近一步递归求解. 然后记得回溯,继续判断下一个和前一个数之和为素数的数. /* HDU 1016 Prime Ring Problem --- 经典DFS */ #include <cstdio> #include <cstring> int n; bool primer[45], visit[25]; //primer打素数表,visit标记是否访问 int a[25]; //数组a存储放置的数 /

【dfs】hdu 1016 Prime Ring Problem

[dfs]hdu 1016 Prime Ring Problem 题目链接 刚开始接触搜索,先来一道基本题目练练手. 注意对树的深度进行dfs dfs过程中注意回退!!! 素数提前打表判断快一些 参考代码 /*Author:Hacker_vision*/ #include<bits/stdc++.h> #define clr(k,v) memset(k,v,sizeof(k)) using namespace std; const int _max=1e3+10;//素数打表 int n,pr

HDU 1016 Prime Ring Problem (素数筛+DFS)

题目链接 题意 : 就是把n个数安排在环上,要求每两个相邻的数之和一定是素数,第一个数一定是1.输出所有可能的排列. 思路 : 先打个素数表.然后循环去搜..... 1 //1016 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 6 using namespace std ; 7 8 bool vis[21]; 9 int prime[42] ,cs[21]; 10 int n ; 11

hdu 1016 Prime Ring Problem (简单DFS)

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25700    Accepted Submission(s): 11453 Problem Description A ring is compose of n circles as shown in diagram. Put natural numb

hdu 1016 Prime Ring Problem (dfs)

一切见注释. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool vis[22]; int n; int ans[22]; int top; bool isprime(int x)//判断素数 { for(int i=2;i<x;i++) if(x%i==0)return false; return

[HDU 1016]--Prime Ring Problem(回溯)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2