标签:
描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。 为了简便起见,我们规定每个素数环都从1开始。 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。 输出 每组第一行输出对应的Case序号,从1开始。 如果存在满足题意叙述的素数环,从小到大输出。 否则输出No Answer。 样例输入 6 8 3 0 样例输出 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 Case 3: No Answer #include<stdio.h> #include<string.h> int prime[40] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; //40 以内 的 素数,0代表 非素数,1代表素数 int a[21];//起标记作用 int ring[21]; //素数环 里面的 数 void dfs(int k,int n) { int i; if( k == n + 1 && prime[ ring[n] + ring[1] ] ) // 首尾相加之和也为 素数的 { printf("1"); for(i = 2; i <= n; i++) printf(" %d",ring[i]); // 把 2 之后的素数 输出来 printf("\n"); return ; } for(i = 2; i <= n; i++) { if(!a[i] && prime[i + ring[k-1] ]) // 如果这个数当前没用过 && 和之前的数 相加的和为素数,就继续执行 { a[i] = 1; // 这个数已经用过 ring[k] = i; // 把当前的数 存在素数环中 dfs(k + 1,n); // 继续 寻找下一个 符合条件的 数 a[i] = 0; // 把刚才尝试的数 召回,把它看作是没有用过 } } } int main() { int T,n; T = 1; while(~scanf("%d",&n),n) { printf("Case %d:\n",T++); if(n == 1) { printf("1\n"); continue; } if(n & 1) { printf("No Answer\n"); // 如果 n 是奇数 ,就是 No Answer continue; } memset(a,0,sizeof(a)); a[1] = ring[1] = 1; // 因为题目要求 只能输出 以 1 开头的数 dfs(2,n); // 所以从 2 开始搜索 } return 0; }
标签:
原文地址:http://blog.csdn.net/wangshuazi/article/details/51365885