广度优先搜索典例

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. Python之psutil-进程管理

    在给PC端应用做自动化测试或者监测应用性能时,不可避免的会与进程管理打交道,python中的psutil模块能够帮助我们处理进程,它主要用于系统监视.分析和限制进程资源以及管理正在运行的进程.一起来了 ...

  2. 快速搭建SSM基本项目

    快速搭建SSM项目基本手脚架 Maven构建项目 一般我们使用Maven来管理我们的项目: 导入相关依赖配置pom.xml: <?xml version="1.0" enco ...

  3. 模拟BS服务器

    一.模拟BS服务器分析 二.BS模拟服务器代码实现 图片都是单独请求,后台单独线程,这边是通过构造方法传入的Runable接口的实现类匿名对象创建线程: 创建本地输入流读取到网络输出流传过来的信息再放 ...

  4. clion结合vcpkg以及GTest的使用

    目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...

  5. Playfield 类方法的注释

    前言 本篇随笔的底包采用的是百度炉石兄弟吧20200109折腾版中自带的 routines 文件. 本次仅为绝大多数方法添加 xml 注释和简单解析,没有具体解析与重构. Playfield 类方法众 ...

  6. 第七章:网络优化与正则化(Part2)

    文章相关 1 第七章:网络优化与正则化(Part1) 2 第七章:网络优化与正则化(Part2) 7.3 参数初始化 神经网络的参数学习是一个非凸优化问题.当使用梯度下降法来进行优化网络参数时,参数初 ...

  7. c++ 打包函数教程

    c++当要重复运行一些代码时可以打包一个函数 当没有返回值时用void打包函数: #include <iostream> #include <stdio.h> using na ...

  8. python matplotlib.pyplot 散点图详解(2)

    python matplotlib.pyplot 散点图详解(2) 上期资料 一.散点图叠加 可以用多个scatter函数叠加散点图 代码如下: import matplotlib.pyplot as ...

  9. Java基础系列(16)- Scanner进阶使用

    了解更多的sanner方法 Ctrl+鼠标左键,点击[Scanner] 点击Structure 看到了Scanner类下面的所有方法,以及具体方法实现的底层封装逻辑 拓展例子_nextInt()获取和 ...

  10. mogoose 创建数据库并增删改查

    下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); ...