自从学了二叉搜索树对DFS有信心了所以来学DFS
一、自己理解,实在不行就自己画树,打印的方法,数组存储每一步,然后到最后一步打印即可
二、筛选法代码忘了……
三、回溯 所以vis[i]要归于0
四、读题,空行 还有记得因为是环 所以需要判断第n个数加一是不是素数
五、貌似奇数除了1其他都没结果 所以加个判断 可以让时间减少很多(hdu的测试数据应该没有奇数,传说ZOJ有……)
六、 最重要的,素数的范围,开始的时候以为开一个prime[22],就够了…好蠢,最坏的应该是19+20=39;
以下为题目及代码
Prime RingProblem
Time Limit: 4000/2000 MS(Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19908 Accepted Submission(s): 8908
Problem Description
A ring is composeof n circles as shown in diagram. Put natural number 1, 2, ..., n into eachcircle separately, and the sum of numbers in two adjacent circles should be aprime.
Note: the number of first circle should always be 1.
Input
n (0 < n <20).
Output
The output formatis shown as sample below. Each row represents a series of circle numbers in thering beginning from 1 clockwisely and anticlockwisely. The order of numbersmust satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
6
8
Sample Output
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Source
Asia 1996, Shanghai (Mainland China)
Recommend
JGShining
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
bool prime[45];
int t[21],n,j,e;
bool vis[21];
void dfs(int cur,int m)
{
int i;
if(cur==n+1)
{
if(prime[m+1])
{
if(e){e=0;printf("Case %d:\n",j);}
for(i=1;i<n;i++)printf("%d ",t[i]);
printf("%d\n",t[n]);
}
return;
}
for(i=1;i<=n;i++)
if(!vis[i]&&prime[i+m]){vis[i]=1;t[cur]=i;dfs(cur+1,i);vis[i]=0;}
}
int main()
{
int i=0;
j=0;
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
memset(prime,0,sizeof(prime));
prime[2]=1;
prime[3]=1;
prime[5]=1;
prime[7]=1;
prime[11]=1;
prime[13]=1;
prime[17]=1;
prime[19]=1;
prime[23]=1;
prime[29]=1;
prime[31]=1;
prime[37]=1;
prime[41]=1;
while(scanf("%d",&n)!=EOF)
{
e=1;
j++;
memset(vis,0,sizeof(vis));
vis[1]=1;
t[1]=1;
dfs(2,1);
putchar('\n');
}
return 0;
}