主要是个剪枝,相邻两个数必须是一奇一偶,所以如果是奇数个的话,根本不用考虑,否则会TLE的。
其他的思路很简单,但是实现起来。。。唉。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int A[20],visit[20],ok,n;
int isp[40]={0,1,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,1};
void dfs(int cur)
{
int i;
if(cur==n && isp[A[0]+A[n-1]] && isp[A[n-1]+A[n-2]])
{
for(i=0; i<n; i++)
{
if(i==n-1)
printf("%d",A[i]);
else
printf("%d ",A[i]);
}
ok = 1;
printf("\n");
}
else
{
for(i=2; i<=n; i++)
{
if(!visit[i] && isp[i+A[cur-1]])
{
A[cur] = i;
visit[i] = 1;
dfs(cur+1);
visit[i] = 0;
A[cur] = 0;
}
}
}
}
int main()
{
int i=1,j;
while(scanf("%d",&n)!=EOF)
{
if(n == 0)
break;
printf("Case %d:\n", i++);
memset(visit,0,sizeof(visit));
for(j=0; j<n; j++)
A[j] = j+1;
visit[1] =1;
if(n%2 == 0)
dfs(1);
printf("\n");
}
return 0;
}