一天一道算法题--5.25--bfs或者最短路

好吧 还是拖到了5.26来写本是5.25的题。。。

自我 宽恕

老样子---  感谢    微信平台: 一天一道算法题   无聊的你 也可以去关注一下

题目 链接:http://poj.org/problem?id=3126

题目 大意:  给你2个素数 问从一个素数到另一个转换的过程中  每次只允许改变一个位上的数 并且在改动过程中
保证它也是素数  最少需要多少次实现这个转换?

ok 其实 这题 不算难  当告诉你这是个搜索以后  只是在进行个位 十位 百位 千位 上各个数字尝试的时候
可能会有点小困难吧   反正我是遇到了---------

怎么说呢  你可以选择开一个结构体 来存储 素数和步数     我还是喜欢开2个数组 来实现 
随便 个人喜好问题

我被一个 素数判断函数少个 = 号 找了好久 都没发现  最后还是大神 一眼发现 流弊。。。

这里 有人会在Bfs的时候 自己模拟队列实现 而我还是喜欢直接用 stl里的queue 不会存在 数组大小问题 也感觉更容易

下面 贴上我的代码:

  1 #include <iostream>
2 #include <cstring>
3 #include <queue>
4 using namespace std;
5
6 const int num = 10010;
7 bool vis[num];
8 bool prime[num];
9 int step[num];
10
11 void judge( int n )
12 {
13 bool flag = false;
14 for( int i = 2 ; i*i<=n ; i++ )
15 {
16 if( n%i == 0 )
17 {
18 flag = true;
19 break;
20 }
21 }
22 if( flag )
23 prime[n] = true;//合数 就是 true
24 }
25
26 bool bfs( int st , int end )
27 {
28 int temp;
29 int i;
30 int a , b;
31 queue<int>q;
32 while( !q.empty() )
33 q.pop();
34 q.push(st);
35 if( st==end )
36 {
37 return true;
38 }
39 while( !q.empty() )
40 {
41 int now = q.front();
42 q.pop();
43 if( now == end )
44 return true;
45 a = now%10; //个位上的数
46 b = (now/10)%10;//十位上的数
47 //枚举个位:肯定是奇数 不然不可能是素数
48 for( i = 1 ; i<=9 ; i+=2 )
49 {
50 temp = (now/10)*10 + i;
51 if( temp!=now && !vis[temp] && !prime[temp] )
52 {
53 vis[temp] = true;
54 step[temp] = step[now] + 1;
55 q.push( temp );
56 }
57 }
58 //枚举十位:
59 for( i = 0 ; i<=9 ; i++ )
60 {
61 temp = ( now/100 )*100 + 10*i +a;
62 if( temp!=now && !vis[temp] && !prime[temp] )
63 {
64 vis[temp] = true;
65 step[temp] = step[now] + 1;
66 q.push( temp );
67 }
68 }
69 //枚举百位:
70 for( i = 0 ; i<=9 ; i++ )
71 {
72 temp = ( now/1000)*1000 + 100*i + 10*b + a;
73 if( temp!=now && !vis[temp] && !prime[temp] )
74 {
75 vis[temp] = true;
76 step[temp] = step[now] + 1;
77 q.push( temp );
78 }
79 }
80 //枚举千位 肯定不能以0开头
81 for( i = 1 ; i<=9 ; i++ )
82 {
83 temp = now%1000 + i*1000;
84 if( temp!=now && !vis[temp] && !prime[temp] )
85 {
86 vis[temp] = true;
87 step[temp] = step[now] + 1;
88 q.push( temp );
89 }
90 }
91 }
92 return false;
93 }
94
95 int main()
96 {
97 int t;
98 int st , end;
99 memset( prime , false , sizeof(prime) );
100 for( int i = 1000 ; i<=9999 ; i++ )
101 {
102 judge(i);
103 }
104 while( ~scanf("%d",&t) )
105 {
106 while( t-- )
107 {
108 memset( vis , false , sizeof(vis) );
109 memset( step , 0 , sizeof(step) );
110 scanf( "%d %d",&st,&end );
111 if( bfs( st , end ) )
112 {
113 printf( "%d\n",step[end] );
114 }
115 else
116 {
117 printf( "Impossible\n" );
118 }
119 }
120 }
121 return 0;
122 }

PS:微信上说 可以用 最短路来实现 = 我今晚看有空来 去写下试下
话说  今天的算法题 又已经出来了  
看来要=到 今晚 才能写了 明天又要上那 该死的高数 还有那本来很美好的C++ 被个不好的老师教的。。。。

一天一道算法题--5.25--bfs或者最短路

时间: 2024-10-14 19:30:10

一天一道算法题--5.25--bfs或者最短路的相关文章

一天一道算法题--5.29---动态规划之数塔

感谢微信平台:  一天一道算法题-------每天多一点进步----------- 这题的话 我就直接用我们自己Oj的题目了 戳我 好吧  如今看这题  是很简单  当时 是块被它搞崩溃了   因为 还不知道  dp 这个概念 现在有了这个概念   好多了  但还是 只能做做这种水 dp.... 多么悲伤的故事 这题 因为太水了   晚上 应该会去找个高质量的题来做的 如果你是dp刚刚学 这题真的很适合你 1 #include <iostream> 2 #include <cstring

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.

一天一道算法题--6.25--无定义

感谢微信平台---一天一道算法题--每天多一点进步---- 其实今天我接下去补上的几题都来自---待字闺中 所以我就原封不动的将它的题目与分析搬过来了 原题 给定一个数组,我们可以找到两个不相交的.并且是连续的子数组A和B,A中的数字和为sum(A), B中的元素和为sum(B).找到这样的A和B,满足sum(A) - sum(B)的绝对值是最大的. 例如:[2, -1 -2, 1, -4, 2, 8]划分为A=[-1, -2, 1, -4], B=[2, 8], 最大的值为16 分析 如果没有

一天一道算法题---5.26---思维锻炼

感谢 微信平台: 一天一道算法题 -----  大家没事都可以去关注他 --- 不是做广告的---- 题目大意:  给你一个长度为n的整数序列A1,A2,--,An,找出两个整数Ai和Aj(i<j),使得Ai-Aj尽量大 反正 暴力肯定超时..... 数据大小 我也就给出了 反正 尽量用最好算法去解 就是了 嗯 它给的是o(n)的时间复杂度和空间度   但是很容易转换成o(1)空间度 o(n)时间复杂度的写法 这边给出个 与这题意相同的一个 题目  发现竟然是我以前WA的 怪不得 那么熟悉 ..

一天一道算法题---6.3---二分运用

感谢微信平台 : 一天一道算法题 -----  一天多一点进步----- 先来段 废话: 已经 3 4天没更了 主要还是自己 太懒了 .... 好 让我们 开始吧 题目链接: touch  me 是不是 有点长啊  最可恶的是 还有张 诱人的 馅饼  --- 话说 有个很好的美国系列校园青春 sex movie ---  American Pie  --- 美国派----- 题目大意: 有F+1个人来分N个圆形蛋糕 每个人得到的必是一整块蛋糕 (不是由几块拼在一起的)面积要相同 求每个人最多能得

一天一道算法题---5.24.--递归

感谢 微信号---code4god  这是他们的微信平台  每日会提供一道算法题   我只是个搬运工 我们每一天都应该比昨天更强一点 观察下列式子:12 = 12*1 12 = 6*212 = 4*312 = 3*412 = 3*2*212 = 2*612 = 2*3*212 = 2*2*3对于给定的n 计算n公有多少种不同的分解式? 1 #include <iostream> 2 using namespace std; 3 4 int cnt;//记录拆分次数 5 void slove(

一天一道算法题--6.9--数学题

感谢微信平台----一天一道算法题---------每天多一点进步---- 今天 刚刚又玩了2盘 LOL  把我的时间全给弄光了..... 因为 晚上 可能开始写课程设计了 抓紧时间 写了今天的 关于那个 stack的 感觉超出我预期想象了 得压几天了 哎.. problem: 求和为指定数字的连续正整数序列 for example: Sn = 100时 18 19 20 21 22 9 10 11 12 13 14 15 16 analyse: 有事  先撤..... 刚刚头太痛 眼睛太酸了

一天一道算法题---6.27---二分图

感谢微信平台---一天一道算法题---每天多一点进步--- Ah... last... 也很晚了 快2点半了 C罗也告别这届世界杯了  主要还是输给德国太多球了 美国也没赢 唉 还是来源于----> 待字闺中 原题 大家都知道facebook用户都是双向的好友,a是b的好友,那么b一定是a的好友,现在给定一个用户列表,其中有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,并且每组内的用户,互相都不是好友.如果能,请给出这个划分. 例子1: 用户:{1, 2, 3} 好友关系:1-2,

前端面试的一道算法题

(使用canvas解答) 下面说一个跟前端有点相关并且有点趣的一道算法题. 题目: 平面上有若干个不特定的形状,如下图所示.请写程序求出物体的个数,以及每个不同物体的面积. 分析 想要知道有多少个图形,想到的就是先获取图片中的每一个像素点然后判获取像素点的背景颜色(RGBA).想要获得图片中的每一个像素点,那就可以联想到使用h5的canvas.如下: 菜鸟教程中canvas的getimagedata方法http://www.runoob.com/tags/canvas-getimagedata.