题目描述
如图所示为一个由n个圆圈构成的圆环。将自然数1,2,…,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。
输入格式
输入包含多组测试数据。每组输入占一行,为整数n(0<n<20),表示圆圈数。
输出
对于每组输入,输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个空行。具体输出格式见输出样例。
注意:只能按照顺时针方向放置数字。
样例输入
6
8
样例输出
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到n的全排列,然后再用一个循环判断是不是满足条件就可以了。
下面是代码:
#include <stdio.h>
#include <string.h>
int n,a[21],book[21];
bool prime(int num)//判断是不是素数
{
int T,D;
if(num%2==0)
return false;
D=3;
T=num;
while(T>D)
{
if(num%D==0)
return false;
T=num/D;
D+=2;
}
return true;
}
void dfs(int step)//深搜1到n的全排列。
{
int i;
if(step == n+1)
{
a[n+1]=a[1];
if(a[1]!=1)
return ;
for(i=1;i<=n;i++)
{
if(prime(a[i]+a[i+1])==0)//来判断条件不是不是满足
return ;
}
for(i=1; i<=n; i++)
printf("%d%c", a[i],i==n?'\n':' ');//输出满足条件的序列
}
for(i=1; i<= n; i++)//深搜的核心代码。
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return ;
}
int main()
{
int count;
count=0;
while(~scanf("%d", &n))
{
memset(book,0,sizeof(book));
count++;
printf("Case %d:\n",count);
dfs(1);
}
}