题目链接:

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

(经典的剪枝搜索)

题意:

就是求1~n的一个环(首尾衔接,顺序打乱),使得相邻的两个元素之和为一个素数

题解1:

用C++中得STL生成全排列,超时!!!!

#include <cstdio>  #include <algorithm>  using namespace std;    int A[30];  bool prime[50];  bool is_prime(int n)  {      for (int i = 2; i*i <= n; i++)      {          if (!(n % i))          {              return 0;          }      }      return 1;  }    int main()  {      //freopen("input.txt","r",stdin);      for (int i = 0; i < 50; i++)      {          prime[i] = is_prime(i);      }      int N;      int nCase = 0;      while (~scanf("%d",&N))      {          printf("Case %d:\n",++nCase);          for (int i = 0; i < N; i++)              A[i] = i+1;          do          {              int ok = 1;              for (int i = 0; i < N-1; i++)              {                  if (!prime[A[i] + A[i+1]])                  {                      ok = 0;                      break;                  }              }                if (ok && prime[A[0]+A[N-1]])              {                  printf("%d",A[0]);                  for (int i = 1; i < N; i++)                  {                      printf(" %d",A[i]);                  }                  printf("\n");              }          }          while (next_permutation(A+1,A+N));          printf("\n");      }  }  

解法2:

递归搜索(+剪枝)

(一个PE搞了我好半天,本以为这个题跟Uva的一模一样......

Uva原文链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=465)

#include <cstdio>  #include <cstring>  using namespace std;    bool vis[50],prime[50];    bool is_prime(int n)  {      for (int i = 2; i*i <= n; i++)          if (!(n % i))              return 0;      return 1;  }  void init()  {      for (int i = 0; i < 50; i++)          prime[i] = is_prime(i);  }    void dfs(int *A,int cur,int n)  {      if (cur == n && prime[A[0] + A[n-1]])      {          printf("%d",A[0]);          for (int i = 1; i < n; i++)              printf(" %d",A[i]);          printf("\n");      }      else      {          for (int i = 2; i <= n; i++)          {              if (!vis[i] && prime[i + A[cur-1]])              {                  A[cur] = i;//尝试在*A中填入各种数                  vis[i] = 1;                  dfs(A,cur+1,n);                  vis[i] = 0;//记得一定得改回来(回溯常用技巧!!!)              }          }      }  }    int main()  {      init();  //    freopen("input.txt","r",stdin);      memset(vis,0,sizeof(vis));      int A[30] = {1};      int N;      int nCase = 1;      while (~scanf("%d",&N))      {          /*                  if (nCase > 1)                     printf("\n");          */          printf("Case %d:\n",nCase++);          dfs(A,1,N);          printf("\n");//如果是Uva上的素数环的话,就用上面的/*if (nCase > 1) printf("\n");*/      }  }  

转载于:https://blog.51cto.com/zhujifang/1380277

杭电ACM_1016_素数环相关推荐

  1. 浙江杭电计算机系的秦嘉珩,迎新季丨@2019级杭电小萌新,你们的最美辅导员上线啦!...

    原标题:迎新季丨@2019级杭电小萌新,你们的最美辅导员上线啦! 2019级小萌新们 欢迎大家加入杭州电子科技大学 在即将开启的四年大学生活中 有这样一位亲切的老师 陪你军训,与你谈心,为你保驾护航 ...

  2. 【杭电ACM】1097 A hard puzzle

    [杭电ACM]1097  A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...

  3. 【ACM】杭电OJ 1106 函数atoi

    函数atoi是把字符串转化成整数的函数,头文件为 #include "stdlib.h" e.g. 运行环境:Dev-C++ 5.11 杭电1106 调用了sort函数,运行的时间 ...

  4. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  5. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  6. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  7. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  8. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  9. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

最新文章

  1. 全球AI技术开放日系列之(七):走进阿里业务中台
  2. 详解COOKIE和SESSION关系和区别
  3. 如何計算SDRAM使用頻寬?
  4. Winform中使用mysqldump实现选择部分表定期备份mysql数据库
  5. 同软件多个线程设置不同ip_软件测试如何自学?收下这份《2020千锋性能测试入门视频教程》...
  6. 自己动手开发SAP Spartacus focus Directive的单元测试
  7. Hadoop(5)-Hive
  8. 【二分】抄书 (jzoj 2123)
  9. redis的内存优化【转】
  10. 数据结构 堆 栈 是什么 区别
  11. e盾网络验证源码_趣味设计模式系列:代理模式JDK动态代理源码解析,一文便知
  12. fastjson:map转json字符串、json字符串转map、map根据key名拿value、JSONArray转list
  13. Gradle初级使用教程
  14. 软件测试:什么是图灵测试
  15. 生信宝典:生物信息学习系列教程、视频教程
  16. java tar.gz 格式多文件打包压缩与解压
  17. 一个html页面请求多个接口,前端页面,一个页面几个接口请求比较合理?
  18. 微信小程序支付组件开发实战
  19. ST2Vec: Spatio-Temporal Trajectory Similarity Learning in Road Networks
  20. 前端开发免费学习资源分享

热门文章

  1. DCMTK:dcmseg模块的辅助功能
  2. DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
  3. VTK:小部件之HoverWidget
  4. QT的QSignalMapper类的使用
  5. 经典C语言程序100例之八三
  6. 经典C语言程序100例之七八
  7. c语言 百钱买百鸡问题
  8. 安装python应该先安装pycharm还是python_Pycharm及python安装详细步骤及PyCharm配置整理(推荐)...
  9. B15_NumPy 矩阵库(Matrix)(empty(),zeros(),ones(),eye(),identity(),rand())
  10. presto-server-0.198集群安装