首页 > 代码库 > HDU 1016 素数环(深搜)
HDU 1016 素数环(深搜)
Prime Ring ProblemTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25134 Accepted Submission(s): 11222Problem DescriptionA 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. Inputn (0 < n < 20). OutputThe output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.You are to write a program that completes above process.Print a blank line after each case. Sample Input68 Sample OutputCase 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2
题目意思就是给一个数n,1-n数字围成一个环,环中每两个相邻的数字相加为素数,把满足条件所有环输出,1始终为第一个数字。
感觉是深搜,于是水过了。。
代码:
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <math.h> 6 #include <vector> 7 using namespace std; 8 9 int used[20];10 int p[40];11 int n;12 vector<int>a;13 int kase;14 void dfs(int k)15 {16 if(k>=n)17 {18 if(!p[a[0]+a[n-1]]) //数组首位相连构成环,首位相加为素数才满足条件 19 {20 printf("%d",a[0]);21 for(int i=1;i<a.size();i++)22 printf(" %d",a[i]);23 printf("\n");24 }25 return;26 }27 for(int i=2;i<=n;i++)28 {29 int b=a[a.size()-1];30 if(!used[i]&&!p[b+i])31 {32 a.push_back(i);33 used[i]=1;34 dfs(k+1);35 a.pop_back();36 used[i]=0;37 }38 }39 }40 main()41 {42 int i, j, k;43 memset(p,0,sizeof(p)); 44 p[1]=1;p[2]=0;45 for(i=2;i<=40;i++) //筛选法求素数 46 {47 for(j=2;j*i<=40;j++)48 p[j*i]=1;49 }50 kase=1;51 while(scanf("%d",&n)==1)52 {53 54 memset(used,0,sizeof(used));55 used[1]=1;56 a.clear();57 a.push_back(1);58 printf("Case %d:\n",kase++);59 dfs(1);60 cout<<endl;61 }62 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。