题目链接: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