NYOJ-488 素数环
素数环
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描写叙述
-
有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数。称为素数环。
为了简便起见,我们规定每一个素数环都从1開始。
比如,下图就是6的一个素数环。

- 输入
- 有多组測试数据。每组输入一个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
01.#include<stdio.h>02.#include<string.h>03.intused[25];//标记位。0:未被使用;1:已被使用;04.inta[25];//用于存储每一位上的数字;05.intprime[45] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,06.1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,07.0,0,0,1,0,0,008.};//素数的哈希表,下标代表详细数字,0:该数字不是素数;1:该数字是素数;09.10.intn;11.intcount = 1;12.//--------------------------------------------------------------13.// 此函数用于推断填入第t位置的数字i是否满足题目要求。14.//--------------------------------------------------------------15.16.intcheck(intt,inti)//T里放I;t:第t个格子;i:要放入t中的数字。17.{18.if(t != n)//n:该素数环一共同拥有n个数字;此举表示当t没到n的时候。19.{20.if(prime[i + a[t - 1]] == 1)//推断假设要填进去的数字i与前一个数字的和是素数21.return1;//满足上述条件。则返回1。22.else23.return0;//不满足上述条件。则返回0;24.}25.else//假设当t已经等于n时,即表示已经填到最后一位的时候26.{27.if(prime[i + a[t - 1]] == 1 && prime[i + 1] == 1)/*假设要填进去的数字和前一位数字28.的和是素数。而且因为这是一个环,还要保证填进去的最后一个数字与第一个格子的数字‘1’的和是素数*/29.return1;//满足条件。返回1。30.else31.return0;//不满足条件返回0;32.}33.}34.35.voidtrackback(intt)36.{37.inti;38.if(t > n)//当t大于n的时候,表明已经填全然部数字。39.{40.for(i = 1; i < n; i ++)//输出各个位上的数字;41.printf("%d ",a[i]);42.printf("%d\n",a[i]);//最后一位输出换行;43.}44.else//否则的话,表示尚未到最后一位数字;45.{46.for(i = 2; i <= n; i ++)//因为第一位i经固定是1。因此从第二位開始推断,到n;47.{48.if(!used[i] && check(t, i))//假设填入的数字尚未被使用过,而且填在这个位置是经过check函数推断合理的;49.{50.used[i] = 1;//将这个数字标记位设为1,表示已被使用;51.a[t] = i;//将这个数填入数组52.trackback(t + 1);//进行下一步的推断,递归推断;53.used[i] = 0;54.}55.}56.}57.}58.intmain()59.{60.n = 10;61.while(scanf("%d",&n) != EOF)62.{63.if(n != 0)64.{65.if(n % 2 != 0 && n != 1)66.{67.printf("Case %d:\n",count);68.count ++;69.printf("No Answer\n");70.continue;71.}72.memset(used, 0,sizeof(used));73.a[1] = 1;74.printf("Case %d:\n",count);75.count ++;76.trackback(2);//题目要求第一位是1,因此从第二位開始运行;77.}}78.return0;79.}
浙公网安备 33010602011771号