Description
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Input
n (0 < n <= 16)
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements.
You are to write a program that completes above process.
Sample Input
6 8
Sample Output
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
解题思路:这个题目的意思是输入一个偶数将其组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。这个问题使用回溯法是很好的解题方法,还需注意的是最后一个数和第一个数之和也要为素数。并且这种没有限制条件停止的一般都要在输入数字时判断是否输入错误(!=EOF)
程序代码:
#include <cstdio>
int n,A[18],vis[18],i;
int isp(int num)
{
for(i=2;i*i<=num;i++)
{
if(num%i==0)
return 0;
}
return 1;
}
void dfs(int cur)
{
if(n==cur&&isp(A[1]+A[n]))//递归边界,别忘了测试第一个数和最后一个数
{
for(i=1;i<n;i++)
printf("%d ",A[i]);
printf("%d\n",A[n]);//打印方案
}
for(int i=2;i<=n;i++)//尝试放置每个标志i
{
if(!vis[i]&&isp(i+A[cur]))//如果i没有用过,;并且与前一个数之和为素数
{
vis[i]=1;//设置使用标志
A[cur+1]=i;
dfs(cur+1);
vis[i]=0;//清楚标志
}
}
}
int main()
{
int t=0;
while(scanf("%d",&n)!=EOF)
{
A[1]=1;
if(t!=0)
printf("\n");
t++;
printf("Case %d:\n",t);
dfs(1);
}
return 0;
}