标签:
题意:
输入正整数n,把整数1,2,3,……,n组成一个环,使得相邻的两个整数之和均为素数。输出时从整数1 开始逆时针排列。同一个环应恰好输出一次。n<=16。
6 8
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
分析:
应用DFS和回溯法。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 7 int is_prime(int x) 8 { 9 for(int i = 2; i*i <= x; i++) // 注意:i<=sqrt(x)。 10 if(x % i == 0) 11 return 0; 12 13 return 1; 14 } 15 16 int n, A[50], isp[50], vis[50]; 17 18 void dfs(int cur) 19 { 20 if(cur == n && isp[A[0]+A[n-1]] ) //最后一个数字需要单独判断。 21 { 22 for(int i = 0; i < n; i++) 23 { 24 if(i != 0) printf(" "); //控制每次第一个数字前不输出空格 25 printf("%d", A[i]); 26 } 27 printf("\n"); 28 } 29 else for(int i = 2; i <= n; i++) //放置每个数i 30 if(!vis[i] && isp[i+A[cur-1]]) //如果i没有被用过,并且和前一个数的和为素数 31 { 32 A[cur] = i; 33 vis[i] = 1;//设置使用标志 34 dfs(cur+1); 35 vis[i] = 0;//清除标志 36 } 37 } 38 39 int main() 40 { 41 int kase = 0; 42 while(scanf("%d", &n) == 1 && n > 0) 43 { 44 if(kase > 0) 45 printf("\n"); 46 printf("Case %d:\n", ++kase); 47 48 for(int i = 2; i <= n*2; i++) 49 isp[i] = is_prime(i); 50 51 memset(vis, 0, sizeof(vis)); //清零操作 52 A[0] = 1; //题目要求每组第一个数字为1 53 dfs(1); 54 } 55 return 0; 56 }
3thweek.c uva 524.prime ring problem
标签:
原文地址:http://www.cnblogs.com/x512149882/p/4695881.html