题目大意:输入正整数n,把整数1,2...,n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针(题目中说的不是很明白??)排列。同一个环应恰好输出一次。
枚举,并在枚举每一个数是进行判断,可以提高效率。
1 #include <cstdio> 2 #include <cstring> 3 4 int A[20], vis[20]; 5 int n; 6 7 int is_prime(int n) 8 { 9 for(int i = 2; i*i <= n; i++) 10 if(n % i == 0) return 0; 11 return 1; 12 } 13 14 void dfs(int cur) 15 { 16 if(cur == n && is_prime(A[0]+A[n-1])) 17 { 18 for(int i = 0; i < n; i++) 19 { 20 printf("%d", A[i]); 21 printf("%s", i == n-1 ? " " : " "); 22 } 23 return; 24 } 25 for(int i = 2; i <= n; i++) 26 if(vis[i] == 0 && is_prime(i+A[cur-1])) 27 { 28 A[cur] = i; 29 vis[i] = 1; 30 dfs(cur+1); 31 vis[i] = 0; 32 } 33 } 34 35 int main() 36 { 37 #ifdef LOCAL 38 freopen("in", "r", stdin); 39 #endif 40 int kase = 0; 41 while(scanf("%d", &n) != EOF) 42 { 43 memset(vis, 0, sizeof(vis)); 44 A[0] = 1; 45 vis[1] = 1; 46 if (kase) printf(" "); 47 printf("Case %d: ", ++kase); 48 dfs(1); 49 } 50 return 0; 51 }
以前写了一次,WA了两次,也看不出来怎么错的,今天在JOJ又看到了,就又看了看,还是不知道怎么错的,知道搜别人代码了,然后发现是在最后一个case后多输一个空行,去掉后试了一下,竟然AC了...好吧,格式错误不是该是PE吗?害我一直以为是答案错了呢