hdu 1016 Prime Ring Problem

//非递归:
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
#define N 22
int a[N],x[N],second,tag;
const bool isprime[41]= {0,
0,1,1,0,1,0,1,0,0,0,
1,0,1,0,0,0,1,0,1,0,
0,0,1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,0,0
};
bool isvalid(int k,int n)
{
int i;
for(i=0; i<k; i++)
if(x[i]==x[k])
return false;
for(i=0; k>0 && i<k; i++)
if(isprime[a[x[i]]+a[x[i+1]]]==false)
return false;
if(k==n-1 && isprime[a[0]+a[x[k]]]==false)
return false;
return true;
}
void print(int n)
{
second=a[x[n]];
tag=1;
int i;
printf("%d",a[x[0]]);
for(i=1; i<=n; i++)
printf(" %d",a[x[i]]);
printf("\n");
}
void solve(int n)
{
x[0]=0;
int k=1,count=0;
x[k]=-1;
while(k>=1)
{
x[k]++;
while(x[k]<=n-1 && !isvalid(k,n))
x[k]++;
if(x[k]>n-1)
k--;
else if(k==n-1)
{
print(k);
}
else x[++k]=-1;
}
}
int main()
{
int n,i,lim,t=1;
while(scanf("%d",&n)!=EOF)
{
if(n&1)
{
printf("Case %d:\n\n",t++);
continue;
}
for(i=0; i<n; i++)
a[i]=i+1;
printf("Case %d:\n",t++);
tag=0;
solve(n);
printf("\n");
}
return 0;
}
//********************************************************
//递归:
#include <stdio.h>
#include <string.h>
#define N 22
bool used[N],isprime[38] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1};
int lim,ans[N]= {1};
void dfs(int cur)
{
if(cur==lim && isprime[ ans[0]+ans[cur-1] ])
{
printf("1");
for(int i=1; i<lim; i++)
printf(" %d",ans[i]);
printf("\n");
}
else
for(int i=2; i<=lim; i++)
{
ans[cur]=i;
if(!used[i] && isprime[ i+ans[cur-1] ])
{
used[i]=true;
dfs(cur+1);
used[i]=false;
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&lim)!=EOF)
{
memset(used,false,sizeof(used));
printf("Case %d:\n",cas++);
dfs(1);
printf("\n");
}
}
浙公网安备 33010602011771号