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
问题描述:
给定一个数n,有1到n共n个自然数,使这n个自然数组成一个环,要求环中相邻两个数之和为素数,求能够组成这种环的所有情况。
比如n=8,满足条件的素数环有:
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
共4种可能。
思路:
对每一个位置的数进行循环遍历,每次都把1到n搜索一遍,符合条件就填进去(记录下来),扫描下一个位置的数字,不符合条件的就跳过。
#include <stdio.h>
#include <string.h>
int flag[30]; //标记已经选过的数
int a[100];
int n;
int check(int x) //判断是否为素数
{
int i;
for(i=2;i<x;i++)
if(x%i==0)
return 0;
return 1;
}
void DFS(int k,int index)
{
int i;
a[k]=index;flag[index]=1;
if(k==n)
{
if(check(a[k]+a[1])) //判断第一个和最后一个是否满足条件
{
printf("1");
for(i=2;i<=n;i++) //如果满足说明搜索结束,输出结果
printf(" %d",a[i]);
printf("\n");
}
return ;
}
for(i=1;i<=n;i++) //每回从第一个开始搜索
{
if(!flag[i]&&check(a[k]+i)) //判断是否相加为素数
{
DFS(k+1,i);
flag[i]=0; //注意回溯
}
}
return ;
}
int main()
{
int t=1;
while(scanf("%d",&n)!=EOF)
{
printf("Case %d:\n",t++);
memset(flag,0,sizeof(flag)); //标志位数组清0
DFS(1,1);
printf("\n");
}
return 0;
}