Description
Note: the number of first circle should always be 1.

Input
Output
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
这道题为素数环问题,要求用1到n的数构成一个环,满足相邻两个数之和为素数,并将其构成的素数环输出。这是一道DFS题,可以先对1到n相加得到的数是否为素数进行预处理,然后就从i=2开始进行DPS搜索了。
源代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
int f[40]={0,0,1},a[20]={1},b[20],n,t,m=0,h;
void s(int t)
{ int i;
if(t==n)
{if(f[a[n-1]+1])
{ cout<<a[0];
for(i=1;i<n;++i)
cout<<" "<<a[i];
cout<<endl;
}
}
else
for(i=2;i<=n;++i)
{
if(f[i+a[t-1]]&&b[i]!=1)
{
a[t]=i;
b[i]=1;
s(t+1);
b[i]=0;
}
}
}
int main()
{ int i,j,k;
for(i=3;i<39;++i)
{ k=1;
for(j=2;j<i;++j)
{
if(i%j==0)
{
k=0;
break;
}
}
f[i]=k;
}
while(cin>>n)
{ t=1;
m++;
h=1;
memset(a,0,sizeof(a));
a[0]=1;
memset(b,0,sizeof(b));
cout<<"Case "<<m<<":"<<endl;
s(1);
cout<<endl;
}
}
最好注意一下输出格式,每行输出的最后一个数据后面没有空格(但原题里没说。。。)。