热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3126BFS,埃式筛选及黑科技

题目大意:给定两个四位素数ab,要求把a变换到b,变换的过程要保证每次变换出来的数都是一个四位素数,而且当前这步的变换所得的

题目大意:给定两个四位素数a  b,要求把a变换到b,变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能重复。

题目链接:点击打开链接

分析:分析可知这题肯定是用搜索,每次改变某位,每位有0-9(首位无0)10种变法,一共40个方向,可是到底DFS还是BFS还是二分呢?只二分对这题显然是不太好写的,DFS的话复杂度为O(40^n)估计几年也出不了结果来,,,然后BFS的话O(40*n)肯定是可以过的。BFS是很好写,麻烦的就在数字的转变和素数的判断。这里素数的判断由于是多组数据我们可以用埃式筛选打一个表(怎么实现可以直接看代码,自己思考下就行了,这里朴素的方法也是可以过的)。对于改变一个数字的某一位我们可以用到sprintf和sscanf这2个黑科技来简单的实现,只要先把初始数字用sprintf打印到字符串里,然后利用字符串的随机访问来改变其中某一位就行了,接下来再用sscanf再输出到temp1中即可。

1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 #define N 100005
7
8 bool prime[N],mark[N];
9 int in,out;
10
11 void bfs()
12 {
13 int i,j;
14 queue<int> q;
15 queue<int> a;//存步数
16
17 memset(mark,0,sizeof(mark));
18 q.push(in);
19 a.push(0);
20 mark[in]&#61;1;
21 while (!q.empty())
22 {
23 int temp&#61;q.front();
24 int ta&#61;a.front();
25 q.pop();
26 a.pop();
27 if (temp&#61;&#61;out)
28 {
29 printf("%d\n",ta);
30 return;//出口记得return!!!
31 }
32 for (i&#61;0;i<4;i&#43;&#43;)
33 {
34 for (j&#61;0;j<&#61;9;j&#43;&#43;)
35 {
36 if (0&#61;&#61;i&&0&#61;&#61;j)//是千位不能为0,所以是0&#61;&#61;i&&0&#61;&#61;j!!!
37 {
38 continue;
39 }
40 char s[6]&#61;"\0";
41 sprintf(s,"%d",temp);
42 s[i]&#61;j&#43;&#39;0&#39;;
43 int temp1;
44 sscanf(s,"%d",&temp1);//新数要新的变量存储&#xff0c;不能用temp!!!
45 if (prime[temp1]&&!mark[temp1])
46 {
47 q.push(temp1);
48 mark[temp1]&#61;1;
49 a.push(ta&#43;1);
50 }
51 }
52 }
53 }
54 printf("Impossible\n");
55 }
56
57 void cprime()//打素数表
58 {
59 int i,j;
60 memset(prime,true,sizeof(prime));
61 prime[0]&#61;prime[1]&#61;false;
62 for (i&#61;2;i)
63 {
64 if (prime[i])
65 for (j&#61;2*i;ji)
66 {
67 prime[j]&#61;false;
68 }
69 }
70 }
71
72 int main()
73 {
74 int t;
75
76 cprime();
77 scanf("%d",&t);
78 while (t--)
79 {
80 scanf("%d %d",&in,&out);
81 bfs();
82 }
83
84 return 0;
85 }

 

转:https://www.cnblogs.com/hemeiwolong/p/9314669.html



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
author-avatar
疯狂的猿猴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有