Description
有一个由n个数字相连组成的圆环(n<20),组成圆环的数字分别为1,2,3...n-1,n.要求每两个相邻元素的和为素数。(注意:第一个元素始终为1)。
Input
n (0<n<20)
Output
要求输出所有符合条件的组成圆环的元素,每个符合条件的圆环按顺时针或者逆时针将元素依次输出,输出格式见样例。要求按字典序输出。
每例以空行分开。
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
解题思路:
这个题主要考察两个问题,一个是素数的求解,另一个是深度优先遍历。对于素数的求解由于是40以的素数,可以在程序中直接给出。对于另个DFS,当时还直没有写出来,最后还是参考了网上的程序。
如果n是大于1的奇数,那么肯定是无解的,因为必有两个奇数相邻。
#include<iostream>
#include<deque>
using namespace std;
const int primeN = 12;
int primes[primeN]={2,3,5,7,11,13,
17,19,23,29,31,37};
bool isPrime[40];
bool inCircle[21];
int p[21];
void dfs(int nth,int n)
{
if(nth==n)
{
if(isPrime[p[nth]+1])
{
for(int i=1;i<n;++i)
cout<<p[i]<<" ";
cout<<p[n]<<endl;
}
return;
}
for(int i=2;i<=n;++i)
{
if(!inCircle[i]&&isPrime[i+p[nth]])
{
p[nth+1] = i;
inCircle[i] = true;
dfs(nth+1,n);
inCircle[i] = false;
}
}
}
int main()
{
int n;
for(int i=0;i<40;++i)
isPrime[i] = false;
for(int i=0;i<primeN;++i)
{
isPrime[primes[i]] = true;
}
int time = 1;
while(cin>>n)
{
cout<<"Case "<<time++<<":"<<endl;
if(n>1&&n%2==1)
{
cout<<endl;
continue;
}
for(int i=1;i<=n;++i)
inCircle[i] = false;
p[1] = 1;
dfs(1,n);
cout<<endl;
}
}
最后欢迎大家访问我的个人网站: 1024s