不过结果很令人遗憾,没有快多少。
/*
* HDU-1016
* mike-w
* 2012-9-25
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 25
#define PRIME_SIZE 64
int prime[PRIME_SIZE];
int f[MAXN];
int prv[MAXN], nxt[MAXN];
int n;
int gen_prime(void)
{
int i, j;
prime[1]=prime[0]=1;
for(i=2; i<PRIME_SIZE; i++)
if(!prime[i])
for(j=i+i; j<PRIME_SIZE; j+=i)
prime[j]=1;
for(i=0; i<PRIME_SIZE; i++)
prime[i]=1-prime[i]; /* if i is prime then prime[i] == 1 */
return 0;
}
int disp(void)
{
int i;
for(i=1; i<=n; i++)
printf("%d%c", f[i], i==n?'\n':' ');
return 0;
}
int search(int id)
{
int i;
for(i=nxt[0]; i!=n+1; i=nxt[i])
if(prime[i+f[id-1]])
{
if(nxt[nxt[0]]==n+1 && prime[i+1]) /* final position */
f[id]=i, disp();
else
{
nxt[prv[i]]=nxt[i];
prv[nxt[i]]=prv[i];
f[id]=i;
search(id+1);
nxt[prv[i]]=i;
prv[nxt[i]]=i;
}
}
return 0;
}
int llist_init(void)
{
int i;
for(i=0; i<=n; i++)
nxt[i]=i+1;
for(i=1; i<=n+1; i++)
prv[i]=i-1;
/* remove 1 */
nxt[0]=2;
prv[2]=0;
return 0;
}
int main(void)
{
int ccase=0;
gen_prime();
while(scanf("%d", &n)!=EOF)
{
memset(f, 0, sizeof(f));
f[1]=1;
llist_init();
printf("Case %d:\n", ++ccase);
search(2);
putchar('\n');
}
return 0;
}