广度优先搜索典例

00 题目

描述:

最简单的队列的使用
#include <iostream>
#include <queue>
using namespace std;
queue<int> q1;
int main()
{
int temp, x;
q1.push(5);//入队
q1.push(8);//入队
temp = q1.front();//访问队首元素
q1.pop();//出队
q1.empty();//判队列是否为空
q1.back();//返回队尾元素
q1.size();//返回队列长度
}

给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次

输入:

输入两个10000以内的正整数m和n,且m小于n

输出:

输出从m变化到n的最少次数

输入样例:

1 16

输出样例:

3

01 思路0

01-1 类型

虽然看上去感觉有一些无处下手,但是实际上就是一个三叉树,并且要去去找 到达目标节点 的最低高度。

这个图转自加1乘2平方题解

很明显,这是个广搜典型题。

01-2 算法

  1. 以初始数字(如1)当作根结点,入队,出队,产生三个子节点next,对子节点筛选符合条件的继续进队

    关于三个子结点的产生,可以设置标志位标记为0,1,2

    • 0->当前值+1

    • 1->当前值*2

    • 2->当前值*当前值

    对应我的change函数

  2. 对next值进行判断

    • 当next为终点数字时,就停止,返回高度(高度需要变量来记)

    • 当next>终点数字时,不再入队。

    • 当next<终点数字时,入队,方便下一步找它的子节点。

  3. 在bfs主控函数中把队列走完,就能解决问题。

  4. 输出

02 代码0

 1 //方法2
2 //按照题目要求使用队列,相应算法是广搜
3 #include<iostream>
4 #include<queue>
5 using namespace std;
6 ​
7 queue<int> q;
8 int m,n;
9 int step[10000];
10 int used[10000];
11 ​
12 int bfs();//广度优先搜索
13 int change(int now, int i);//三种变换
14 bool istarget(int now, int next);
15 //判断是否达到目标数字
16 int main(){
17 cin >> m >> n;
18 //始末位置
19 q.push(m);
20 //m入队
21 cout << bfs() << endl;
22 return 0;
23 }
24 int bfs(){
25 int next;
26 while(!q.empty() ){
27 int now = q.front();
28 q.pop();
29 used[now]=1;
30 for(int i=0; i<3; i++){
31 next = change(now,i);
32 //生成当前节点的下一节点(一共三个)
33 if(istarget(now, next)){
34 return step[next];
35 }//如果就达到目标,就返回走了几步,由于使用广搜,就是最短路径
36 }
37 }
38 return 0;//这点很重要,虽然code永远到不了这里
39 }
40 ​
41 bool istarget(int now,int next){
42 if(next<=n && used[next]==0){//确保子节点未超过目标值且未被访问过
43 used[next]=1;
44 step[next] = step[now] + 1;//从当前到子节点需+1
45 //核心判断
46 if(next == n){
47 return true;
48 }
49 else{
50 q.push(next);
51 //如果不是就吧这个节点当成普通节点放入队列
52 }
53 }
54 return false;
55 }
56 ​
57 int change(int now, int i){
58 if(i==0) return now+1;
59 if(i==1) return now*2;
60 else return now*now;
61 }

03 思路1

03-1 类型

动态规划,更为简洁,只需要一个main函数和两个指针

03-2 算法

  • 从起始数字开始,我设置一个行走位逐个去走到终点

  • 对i进行讨论

    • 先设置基准步伐,比较i的路经长度和i-1的路径长度+1

    • 当i为偶数,比较到达i的路径长度和i/2的路径长度+1

    • 当i为平方数,(可以提前设置一个int 的i的根号,当t*t==i即为这个条件)比较到达i的路径长度和t的路径长度+1

  • 算法原理,因为i是从m开始走的,所以天然不需要循环,只需不断地调用之前的结果进行比较就能得到新的结果,这就是动态规划的魅力所在。算法时间复杂度为O(m-n).

04 代码1

 1 //加1乘2平方
2 ​
3 #include<stdio.h>
4 #include<string.h>
5 #include<iostream>
6 #include<algorithm>
7 #include<cmath>
8 using namespace std;
9 const int maxn = 10000+50;
10 int dp[maxn],m,n;
11 ​
12 //min函数内置了
13 int main(){
14 cin>>m>>n;
15 memset(dp,0x3f3f3f,sizeof(dp));
16 dp[m] = 0;
17 for(int i = m+1; i <= n; i++){
18 int t = sqrt(i);
19 dp[i]=min(dp[i],dp[i-1]+1);
20 if(i%2==0){
21 dp[i] = min(dp[i], dp[i/2]+1);
22 }
23 if(t*t == i){
24 dp[i] = min(dp[i],dp[t]+1);
25 }
26 }
27 cout << dp[n] << endl;
28 return 0;
29 }

noj加1乘2平方的更多相关文章

  1. Noj - 在线强化训练4

    状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...

  2. js原生方法传参的细节(面试必问)

    废话不说,直接上题. slice(),接收两个参数,第一个为开始index(从0开始),第二个为结束的index(也是从0开始,但是不包括index本身,只到index-1).返回值是截取的数组,原数 ...

  3. 2078 Problem H Secret Message 中石油-未提交-->已提交

    题目描述 Jack and Jill developed a special encryption method, so they can enjoy conversations without wo ...

  4. Bzoj 3781: 小B的询问 莫队,分块,暴力

    3781: 小B的询问 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 426  Solved: 284[Submit][Status][Discuss ...

  5. 【TensorFlow篇】--Tensorflow框架初始,实现机器学习中多元线性回归

    一.前述 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,T ...

  6. 委托学习总结(一)浅谈对C#委托理解

    初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少 ...

  7. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  8. 190320运算符&数据类型

    一.运算符 1.算术运算符 + 加 - 减 * 乘 / 除 ** 平方 // 整除 % 取余 2.比较运算符 == 等于 > 大于 < 小于 <= 小于等于 >= 大于等于 ! ...

  9. hash冲突解决和javahash冲突解决

    其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...

随机推荐

  1. 源码解析Spring AOP的加载与生效

    本次博主主要进行Spring AOP这里的解析,因为在工作中使用后,却不知道背后的实现原理并在使用的过程中发现了一些认知缺陷,所以决定写这么一篇文章以供大家参考参考,进入正题. 本次博主使用了@Asp ...

  2. 前后端数据交互(三)——ajax 封装及调用

    有很多框架已经将 ajax 封装,需要的时候只需要调用就好,比如 jquery 是最常用的.我们为什么还需要学习 ajax 的封装呢?首先加强我们对ajax的认识,其次如果只是因为ajax请求需要引入 ...

  3. SprinBoot-SpringData-整合

    目录 SpringData 整合JDBC JDBCTemplate 整合Druid 配置数据源 配置Druid数据源监控 整合MyBatis 整合测试 整合Redis 测试整合 序列化配置 自定义re ...

  4. Mybatis-基本学习(下)

    四,MAP的使用--超常用 思考:多表连接查询怎么做?---MAP的好处!---返回List

  5. 小白也能看懂的dubbo3应用级服务发现详解

    搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...

  6. 任由文字肆意流淌,更自由的开源 Markdown 编辑器

    对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...

  7. 企业快速开发平台Spring Cloud+Spring Boot+Mybatis+ElementUI 实现前后端分离

    鸿鹄云架构一系统管理平台 鸿鹄云架构[系统管理平台]使用J2EE技术来实施,是一个大型分布式的面向服务的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热部署的设计思想,使用成熟领先的无商业 ...

  8. Insecure CAPTCHA (不安全的验证码)

    dvwa不能正常显示,需要在配置文件中加入谷歌的密钥: $_DVWA[ 'recaptcha_public_key' ] = '6LfX8tQUAAAAAOqhpvS7-b4RQ_9GVQIh48dR ...

  9. qGPU on TKE - 腾讯云发布下一代 GPU 容器共享技术

    背景 qGPU 是腾讯云推出的 GPU 共享技术,支持在多个容器间共享 GPU卡,并提供容器间显存.算力强隔离的能力,从而在更小粒度的使用 GPU 卡的基础上,保证业务安全,达到提高 GPU 使用率. ...

  10. http升级https遇到的问题

    1. 功能请求失效: 可能是链接为http请求,导致出现问题 2.浏览器网址左边出现黄色感叹号: 这是由于网页中存在http的图片链接,需要根据实际情况修改; 3.将网页内的http请求变为https ...