热门标签 | 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



推荐阅读
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • 题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • POJ2263是一个经典的图论问题,涉及寻找从起点到终点的最大载重路径。本文将详细介绍该问题的背景、解题思路及代码实现。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • UVa 1579 - 套娃问题
    本题主要涉及动态规划(DP)的应用,通过计算将前i个套娃合并成多个套娃组所需的最小操作次数来解决问题。具体来说,f(i) 表示前i个套娃合并成多个套娃组所需的操作次数,其计算公式为 f(i) = min(f(j) + dp(j+1, i))。 ... [详细]
  • HNOI2003 激光炸弹问题(二维前缀和的应用)难度:中等
    HNOI2003 激光炸弹问题是一个经典的二维前缀和应用题目。本文将详细介绍如何使用二维前缀和解决该问题。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
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社区 版权所有