题目:给出一个n,在1到n中以1为开头构造一个素数环,要求相邻两个元素的和为素数。
先打素数表,再记忆化深搜。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1000;
int n,prime[]={2,3,5,7,11,13,17,19,23},d[MAX_N],ans[MAX_N];
bool sear(int a)
{
for(int i=0;i<9;i++){
if(a==prime[i]) return true;
}
return false;
}
void dfs(int t,int q)
{
d[t]=0;
ans[q]=t;
if(q==n&&sear(t+1)) {
for(int i=1;i<=n;i++){
cout<<ans[i];
if(i==n) cout<<endl;
else cout<<' ';
}
d[t]=-1;
return ;
}
for(int i=1;i<=n;i++){
if(d[i]==0) continue;
if(sear(i+t)) dfs(i,q+1);
}
d[t]=-1;
}
void solve()
{
int st=1,q=1;
memset(d,-1,sizeof(d));
dfs(st,q);
}
int main()
{
int kase=0;
while(cin>>n){
printf("Case %d:\n",++kase);
solve();
cout<<endl;
}
return 0;
}