简单的深度搜索素环问题

杭电地址:http://acm.hdu.edu.cn/showproblem.php?pid=1016

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13751    Accepted Submission(s): 6276

Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
 
Input
n (0 < n < 20).
 
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must 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
 
Recommend
JGShining
 
 
#include <stdio.h>
#include <string.h>

int prime[40]={0,0,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,0};    
int Circle[20];
bool Visit[20],flag;
int n,t=1;

void Dfs(int x,int y)
{
    int i;
  if(y==n+1&&prime[Circle[1]+x]==1)
  {
      if(!flag) {
          printf("Case %d:\n",t++);
          flag=true;
      }
      for( i=1;i<y-1;i++)
          printf("%d ",Circle[i]);
      printf("%d\n",Circle[i]);
      return ;
  }

  for( i=2;i<=n;i++)
      if(!Visit[i]&&prime[x+i]==1)
      {
         Circle[y++]=i;
         Visit[i]=true;
         Dfs(i,y);
         y--;
         Visit[i]=false;
      }

}

int main()
{
    
   while(scanf("%d",&n)==1)
   {
       flag=false;
       memset(Visit,false,sizeof(Visit));
       Visit[1]=true;
       Circle[1]=1;
       Dfs(1,2);
       printf("\n");
   }
    return 0;
}
 
原文地址:https://www.cnblogs.com/hzg656343072/p/2627018.html