题目:
Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, …, n 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 < 20).
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. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
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
解题思路:
创建两个数组一个用来标记这个自然数是否被用过,用深搜进行遍历,继续深入的条件是当前值与上一个的和为素数,结束的条件是b[n]+1为素数,因为第一个数总是1;
错误分析:
小心输出格式,记得加换行。
完整代码:
#include<stdio.h>
int a[22]={0}; //标记每个数字只能用一次
int b[22]={0}; //记录样例
int bb(int m) //正确
{
int i;
if(m==1||m==0)
{
return 0;
}
for(i=2;i<m;i++)
{
if(m%i==0)
{
break;
}
}
if(m==i)
{
return 1;
}
return 0;
}
void aa(int n,int k)
{
int i,j,m;
if(k==n-1)
{
m=1+b[k];
if(bb(m))
{
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%d",b[i]);
else
printf("%d ",b[i]);
}
printf("\n");
return ;
}
}
for(i=2;i<=n;i++)
{
if(a[i]==0) //判断这个数字是否使用过
{
m=i+b[k]; //当前数字和前一个数字的和
if(bb(m)==1) //如果是素数
{
k++;
b[k]=i;
a[i]=1;
aa(n,k);
k--;
a[i]=0;
}
}
}
return ;
}
int main()
{
int n,m,i,j,k;
j=1;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<22;i++)
a[i]=b[i]=0;
b[0]=1;
a[1]=1;
k=0;
printf("Case %d:\n",j);
j++;
aa(n,k);
printf("\n");
}
return 0;
}