首页 > 代码库 > HDU 1016 素数环问题
HDU 1016 素数环问题
题目大意:
给定1-n这n个数,组成以1开头的素数环,保证相邻两个数相加均为素数
题目用dfs搜索再回溯,这样碰到不成立的立刻退出递归,就减少了很多步骤,不然暴力来就是n!次复杂度,肯定是超时的
每次添入数据都要判断是否相邻数相加为素数,所以我们可以提前打个素数表,这样使自己判断素数更加方便
1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 6 #define N 22 7 int n , a[N] , visit[N] , prime[41]; 8 9 void prime_table()10 {11 memset(prime,0,sizeof(prime));12 for(int i = 2;i<40;i++){13 if(!prime[i]){14 for(int j=i+i;j<40;j+=i)15 prime[j] = 1;16 }17 }18 }19 20 void dfs(int x,int cnt)21 {22 visit[x] = 1;23 if(cnt == n && !prime[a[0]+a[cnt-1]]){24 printf("%d",a[0]);25 for(int i=1;i<cnt;i++)26 printf(" %d",a[i]);27 printf("\n");28 }29 30 for(int i=1;i<=n;i++){31 if(!visit[i]&& !prime[a[cnt-1]+i]){32 a[cnt] = i;33 dfs(i,cnt+1);34 visit[i]=0;//回溯35 }36 }37 }38 39 int main()40 {41 int t = 1;42 prime_table();43 while(~scanf("%d",&n))44 {45 printf("Case %d:\n",t);46 47 memset(visit,0,sizeof(visit));48 a[0] = 1;49 dfs(1,1);50 //这里一组数据做完记得换行,题目要求51 printf("\n");52 t++;53 }54 }
HDU 1016 素数环问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。