当前位置: 首页 > news >正文

魔法数字(dfs/bfs)

传送门


题意:

一天,牛妹找牛牛做一个游戏,牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。操作共有三种,如下:

  1. 在当前数字的基础上加一,如:4转化为5
  2. 在当前数字的基础上减一,如:4转化为3
  3. 将当前数字变成它的平方,如:4转化为16

输入:

给定n,m,分别表示牛牛和牛妹的数字。

输出:

返回最少需要的操作数。

方法一(bfs)

每个数字可以看做一种状态,那么本题可以看做隐式图的最短路,考虑 b f s bfs bfs,直接遍历所有的情况,第一次到达 m m m时就是最少的操作次数

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int inf=0x3f3f3f3f;

int d[maxn];
queue<int> q;

int solve(int n,int m){
    memset(d,0,sizeof d);
    if(n>=m) return n-m;
    q.push(n);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(u==m) return d[m];
        if(u<m){
            if(!d[u+1]) q.push(u+1),d[u+1]=d[u]+1;
            if(!d[u*u]) q.push(u*u),d[u*u]=d[u]+1;
        }
        if(u>1 && !d[u-1]) q.push(u-1),d[u-1]=d[u]+1;
    }
    return d[m];
}

int main(){
    int n,m;
    while(cin>>n>>m){
        cout<<solve(n,m)<<endl;
    }
    return 0;
}

方法二(dfs)

实际上只需在 d f s dfs dfs过程中分情况考虑:

  1. n ≥ m n \geq m nm,那么只能每次减少直到为m
  2. 否则就找到 n n n的附近的两个数 i , j i,j i,j,使得 i ∗ i ≤ m , j ∗ j ≥ m i*i \leq m,j*j \geq m iim,jjm,因为此时已经是接近 m m m的数了,无论如何也不会再开方了,那么只需递归到 n , i n,i n,i n , j n,j n,j,找到最小的操作次数即可
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int inf=0x3f3f3f3f;

inline int min(int &x,int &y){
    return x>y?y:x;
}

int dfs(int n,int m){
    if(n>=m){
        return n-m;
    }else{
        int x=n*n;
        if(x==m) return 1;
        if(x>m){
            int i=n,j,k,res;
            while(i*i>m){
                j=i;
                i--;
            }
            if(j*j-m>m-i*i){
                k=i;
                res=m-i*i;
            }else{
                k=j;
                res=j*j-m;
            }
            return min(m-n,dfs(n,k)+1+res);
        }else{
            int i=n,j,k,res;
            while(i*i<m){
                j=i;
                i++;
            }
            if(i*i-m>m-j*j){
                k=j;
                res=m-j*j;
            }else{
                k=i;
                res=i*i-m;
            }
            return min(m-n,dfs(n,k)+1+res);
        }
    }
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    while(cin>>n>>m){
        cout<<dfs(n,m)<<endl;
    }
    return 0;
}

相关文章:

  • Win32 OpenGL编程(8) 3D模型变换及其组合应用
  • 牛妹的春游(二维费用背包+技巧)
  • 2019 ICPC 南京区域赛 - C Digital Path(多段图DP)
  • 去年我们在哪儿?——09年SD2.0大会侧记(2)
  • 2019 CSP-J 纪念品(完全背包+思维)
  • 从MTK的BIN文件里提取图片资源
  • 无题(Floyd的理解)
  • 一个MTK的百叶窗特效
  • 无题(贪心+优先队列)
  • 大会轶事录——09年SD2.0大会侧记(3)
  • 卡特兰数
  • 洛谷 P2532 [AHOI2012]树屋阶梯(高精度卡特兰数)
  • UVA - 580 Critical Mass 四种方法(dp/暴力)
  • 全球20国互联网网速、网费统计:日韩最快最便宜
  • 2020 牛客多校第一场J - Easy Integration(求积分/找规律)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular 4.x 动态创建组件
  • Git 使用集
  • JAVA_NIO系列——Channel和Buffer详解
  • javascript从右向左截取指定位数字符的3种方法
  • Java多线程(4):使用线程池执行定时任务
  • Python - 闭包Closure
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SpringBoot几种定时任务的实现方式
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于 Babel 的 npm 包最小化设置
  • 微服务核心架构梳理
  • 问题之ssh中Host key verification failed的解决
  • 在Unity中实现一个简单的消息管理器
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 国内开源镜像站点
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 安徽锐锋科技IDMS系统简介
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (poj1.2.1)1970(筛选法模拟)
  • (编译到47%失败)to be deleted
  • (待修改)PyG安装步骤
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (十六)一篇文章学会Java的常用API
  • (十五)使用Nexus创建Maven私服
  • (四)Android布局类型(线性布局LinearLayout)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .net framework4与其client profile版本的区别
  • .NET和.COM和.CN域名区别
  • @EnableWebMvc介绍和使用详细demo
  • [ 第一章] JavaScript 简史
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C++]C++基础知识概述