题意:
给你一个数n,将一串数1~n摆成一个环,使环中每两个数的和
都是素数,并且要求圈第一个数是1.
分析:(若菜,有参考,勿喷orz,欢迎交流)
数据很弱n (0 <n < 20).所以可以暴力法。
用一个bool类型的rec[n](初始值为FALSE)
记录1~n是否已经加入圈中,遍历i是否
还没有加入圈中,rec[i]=true;判断是否和上一个数的和是素数,
如果是的话继续dfs并且将此数存入seq[]数组中,
否则rec[i]=false;继续循环下去,直到找了
n个数,然后再判断一首一尾的数的和是素数,若是则输出seq即可
否则继续找。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=25;
int n;
int seq[maxn];//记录答案序列
bool rec[maxn];//记录是否选过
bool prime(double a)//判断数是否是素数
{
int i,ck;
if(a==2) return true;
ck=(int)sqrt(a);
for(i=2;i<=ck;i++)
{
if((int)a%i==0) return false;
}
return true;
}
void dfs(int x)
{
if(x==n&&prime(1+seq[n-1]))
{
for(int j=0;j<n;j++)
{
if(j==0)
printf("%d",seq[j]);
else
printf(" %d",seq[j]);
}
printf("\n");
return;
}
else
{
for(int j=2;j<=n;j++)
{
if(rec[j]==0&&prime(j+seq[x-1]))
{
rec[j]=1;
seq[x]=j;
dfs(x+1);
rec[j]=0;
}
}
}
}
int main()
{
int t=0;
while(~scanf("%d",&n))
{
t++;
printf("Case %d:\n",t);
memset(rec,0,sizeof(rec));
rec[1]=1;
seq[0]=1;
dfs(1);
printf("\n");
}
return 0;
}