以前做过此题,几天又复习一遍。
/*
* HDU-1016 prime ring
* mike-w
* 2011-8-30
* --------------------------------------
* i met this problem for the second time
* practice DFS
* --------------------------------------
* 看来用C提交比较不靠谱,还得GCC
* 题目的样例输出把最后一行的换行符省略了
* 害得我好几次格式错误
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 22
char tag[MAXSIZE];
char prm[MAXSIZE];
int rec[MAXSIZE];
int n,ccase;
int print(int nele)
{
int i;
for(i=1;i<=nele;i++)
printf("%d%c",rec[i],(i==nele?'\n':' '));
return 0;
}
int search(int cnt)
{
int i;
if(cnt==n)
{
for(i=1;i<=n;i++)
if(!tag[i]&&prm[i+rec[cnt-1]]&&prm[i+1])
{
rec[cnt]=i;
print(n);
}
}
else
for(i=1;i<=n;i++)
if(!tag[i]&&prm[i+rec[cnt-1]])
{
rec[cnt]=i;
tag[i]=1;
search(cnt+1);
tag[i]=0;
}
return 0;
}
int main(void)
{
ccase=1;
prm[2]=prm[3]=prm[5]=prm[7]=prm[11]
=prm[13]=prm[17]=prm[19]=prm[23]
=prm[29]=prm[31]=prm[37]=prm[41]=1;
#ifndef ONLINE_JUDGE
freopen("1016.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
memset(tag,0,sizeof(tag));
tag[1]=1;
rec[1]=1;
printf("Case %d:\n",ccase++);
search(2);
putchar('\n');
}
return 0;
}
148




被折叠的 条评论
为什么被折叠?



