zoukankan      html  css  js  c++  java
  • HDU1016 素数环---(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1016

    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
    题意:
    输入整数n (0 < n < 20).
    找出n个整数,能组成一个环,环中任意相邻两数之和为素数,字典序输出所有情况,每种情况1开头
    #include<stdio.h>
    #include<string.h>
    int prime[40]={0,1,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},n;//素数打表,因为n最大是20,所以只要打到40
    int visited[21],a[21];//visited[]标记数组,a[]存符合条件的序列  定包含1->n   只是需要输出特定顺序的n个数//
    void dfs(int num)//深搜
    {
       int i;
       if(num==n&&prime[a[num-1]+a[0]])  //满足条件了,就输出来   然后一步步返回
       {
           for(i=0;i<num-1;i++)
               printf("%d ",a[i]);
           printf("%d
    ",a[num-1]);
       }
       else                    //num  1->n-1
       {
           for(i=2;i<=n;i++)
           {
               if(visited[i]==0)//若未访问
               {
                   if(prime[i+a[num-1]]) //是否和相邻的加起来是素数
                   {
                       visited[i]=-1;//标记了
                       a[num++]=i;//放进数组
                       dfs(num); //递归调用
                       visited[i]=0; //退去标记
                       num--;   
                   }
               }
           }
       }
    }
    int main()
    {
          int num=0;
          while(scanf("%d",&n)!=EOF)
          {
             num++;
             printf("Case %d:
    ",num);
             memset(visited,0,sizeof(visited));//标记数组初始化为0
             a[0]=1;
             dfs(1);
             printf("
    ");
          }
          return 0;
    }
  • 相关阅读:
    PPT_标题
    产品需求撰写-架构图
    测试
    SparkLauncher 1.6 版本bug
    Github fork同步
    Maven 配置远程仓库
    Sqoop2中传入配置文件中url之【坑】
    Spark性能优化-coalesce(n)
    面试算法题目
    Git 基本概念及常用命令
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6534411.html
Copyright © 2011-2022 走看看