题意:1-n围成一个圈,要使相邻的两个数之和为素数;
DFS
第二道没看题解自己搜出来的题,好有成就感!!(虽然比较水吧= =
上代码咯~
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 const int dx[4]= {1,0,-1,0}; 8 const int dy[4]= {0,1,0,-1}; 9 int vis[105],prime[40],n,k1,s[10110],cas; 10 int dfs(int x,int cnt) 11 { 12 if(cnt==n&&prime[x+1])//满足条件时,输出。 13 { 14 printf("1 "); 15 for(int i=0; i<k1; i++) 16 { 17 printf("%d",s[i]); 18 if(i!=k1-1) 19 { 20 printf(" "); 21 } 22 else 23 { 24 printf(" "); 25 } 26 } 27 x=1;//进行下面的搜索的初始化。 28 cnt=1; 29 } 30 else 31 { 32 for(int i=2; i<=n; i++) 33 { 34 if(!vis[i]&&prime[x+i]) 35 { 36 vis[i]=1; 37 s[k1++]=i; 38 dfs(i,cnt+1); 39 vis[i]=0;//如果搜不到就让标记消失~ 40 k1--; 41 } 42 } 43 } 44 return 0; 45 } 46 int main() 47 { 48 memset(prime,0,sizeof(prime));//打一个素数表 49 for(int i=2; i<=40; i++) 50 { 51 int k=sqrt(i); 52 int f=0; 53 for(int j=2; j<=k; j++) 54 { 55 if(i%j==0) 56 { 57 prime[i]=0; 58 f=1; 59 break; 60 } 61 } 62 if(f==0) 63 { 64 prime[i]=1; 65 } 66 } 67 cas=0; 68 while(~scanf("%d",&n)) 69 { 70 cas++; 71 k1=0; 72 memset(vis,0,sizeof(vis));//每次都要初始化 73 printf("Case %d: ",cas); 74 dfs(1,1);//从一开始搜 75 printf(" "); 76 } 77 return 0; 78 }