题目大意:
给定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(" "); 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: ",t); 46 47 memset(visit,0,sizeof(visit)); 48 a[0] = 1; 49 dfs(1,1); 50 //这里一组数据做完记得换行,题目要求 51 printf(" "); 52 t++; 53 } 54 }