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
题解:写个深度优先搜索就行了,代码注释挺详细的:
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,a[25],book[25],prime[45];
void sushu()
{
memset(prime,0,sizeof(prime));
prime[2]=1; prime[3]=1; prime[5]=1; prime[7]=1; prime[11]=1; prime[13]=1; prime[17]=1;
prime[19]=1; prime[23]=1; prime[29]=1; prime[31]=1; prime[37]=1; prime[39]=1;
}
void dfs(int step)//该放置第 step 个数了
{
int i;
if(step==n+1)//输出放置好的情况;
{
if(prime[a[step-1]+1]==1)
{
cout<<a[1];
for(i=2;i<=n;i++)
cout<<" "<<a[i];
cout<<endl;
}
return ;
}
for(i=1;i<=n;i++)
{
if(book[i]==0 && prime[a[step-1]+i]==1) // 数字 i 还没有使用;
{
a[step]=i;
book[i]=1;//标记数字 i 为已使用
dfs(step+1);
book[i]=0;//收回数字 i, 进行下次尝试;
}
}
return ;
}
int main()
{
int k=1;
while(cin>>n)
{
cout<<"Case "<<k<<":"<<endl;
if(n%2==1) ;//n=1,直接跳出;
else
{
sushu();
a[1]=1;
book[1]=1;//第一个 放置 1;
dfs(2);//从 第二个 开始
}
cout<<endl;
k++;
}
return 0;
}