zoukankan      html  css  js  c++  java
  • HDUOJ----(1016)Prime Ring Problem

    Prime Ring Problem

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

    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
    深度搜索....无压力;;
    代码:
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 int str[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
     5 int ans[21]={1};
     6 int n,cnt;  /*代表搜索的深度*/  
     7 bool flag;
     8  /*可能需要剪枝*/
     9 void  dfs(int step)
    10 {
    11     int i,j,temp; 
    12    if(step==n)   /*说明搜索到底了!*/
    13    {
    14         flag=true;
    15          temp=ans[0]+ans[n-1];   //开头和结尾也要判断
    16            for(j=2;j*j<=temp;j++)
    17            {
    18             if(temp%j==0)
    19             {
    20                flag=false;
    21                break;
    22             }
    23            }
    24        if(flag)
    25        {
    26           printf("%d",ans[0]);
    27           for( i=1;i<n;i++)
    28           {
    29            printf(" %d",ans[i]);
    30           }
    31            puts("");
    32        }
    33    }
    34     else
    35     {
    36       for(i=1;i<n;i++)
    37       {
    38           if(str[i])
    39           {
    40              flag=true;     
    41              temp=ans[cnt-1]+str[i];
    42               for(j=2;j*j<=temp;j++)
    43               {
    44                   if(temp%j==0)
    45                   {
    46                      flag=false;
    47                       break;
    48                   }
    49               }
    50             if(flag)
    51             {
    52              ans[cnt++]=str[i];
    53              str[i]=0;
    54              dfs(step+1);
    55              str[i]=ans[--cnt];
    56              ans[cnt]=0;
    57             }
    58           }
    59       }
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     int count=1;
    66     while(scanf("%d",&n)!=EOF)
    67     {
    68         cnt=1;
    69         printf("Case %d:
    ",count++);
    70         dfs(1);
    71         puts("");
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    tmp
    【ask】ghost分区还原win7出现蓝屏,试图加载CLASSPNP驱动时出现
    手动编译svn
    【ask】Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
    c++11小计
    入门系列-ABP CLI
    入门系列-参数验证集成
    入门系列-异常处理
    .NET Core 控制台启动失败“以一种访问权限不允许的方式做了一个访问套接字的尝试”
    入门系列-虚拟文件系统
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3341657.html
Copyright © 2011-2022 走看看