HDOJ搜索专题之Prime Ring Problem

经典的DFS,素数环问题。

题目大意:将从1开始的前n个自然数排成一个圈,使得任意相邻的两个数的和是素数。给定n,按字典序打印结果。

View Code
 1 #include <stdio.h>

 2 #include <string.h>

 3 #define N 20

 4 int a[N],n,cnt;

 5 char is_p[40],vis[N];

 6 void init()

 7 {

 8   memset(is_p,0,sizeof(is_p));

 9   is_p[2]=1;

10   is_p[3]=1;

11   is_p[5]=1;

12   is_p[7]=1;

13   is_p[11]=1;

14   is_p[13]=1;

15   is_p[17]=1;

16   is_p[19]=1;

17   is_p[23]=1;

18   is_p[29]=1;

19   is_p[31]=1;

20   is_p[37]=1;

21   

22   memset(vis,0,sizeof(vis));

23   cnt=0;

24   vis[1]=1;

25   a[0]=1;

26 }

27 void print()

28 {

29   for(int i=0;i<n-1;i++)  printf("%d ",a[i]);

30   printf("%d\n",a[n-1]);

31 }

32 void dfs(int cnt)

33 {

34   if(cnt==n)

35   {

36     if(is_p[1+a[cnt-1]])

37       print();

38     return;

39   }

40   for(int i=2;i<=n;i++)

41   {

42     if(vis[i] || !is_p[i+a[cnt-1]])  continue;

43     vis[i]=1;

44     a[cnt]=i;

45     dfs(cnt+1);

46     vis[i]=0;

47   }

48 }

49 int main()

50 {

51   int kase=0;

52   while(~scanf("%d",&n))

53   {

54     init();

55     printf("Case %d:\n",++kase);

56     dfs(1);

57     printf("\n");

58   }

59   return 0;

60 }

 

你可能感兴趣的:(Prim)