魔法数字

题目链接:https://ac.nowcoder.com/acm/contest/6218/B

Description

一天,牛妹找牛牛做一个游戏,牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:
1.在当前数字的基础上加一,如:4转化为5
2.在当前数字的基础上减一,如:4转化为3
3.将当前数字变成它的平方,如:4转化为16
你能帮牛牛解决这个问题吗?

Input

给定n,m,分别表示牛牛和牛妹的数字。(1≤n,m≤1000)

Output

返回最少需要的操作数。

Solution

bfs+剪枝
开一个数组dis[3100],存放操作数,dis[n]初始化为0,表示从n转化到n需要0次操作。将当前数字n压入队列,然后根据判断条件考虑是否将n-1,n+1,n*n压入队列,直到当前数字为m,搜索结束,返回操作数dis[m]。

Code

class Solution {
public:
   /**
    * 返回最后要输出的答案
    * @param n int整型 表示牛牛的数字
    * @param m int整型 表示牛妹的数字
    * @return int整型
    */
   int solve(int n, int m) {
       if(n==m) return 0;
       queue<long long> q;
       int dis[3100];
       memset(dis,-1,sizeof(dis));
       dis[n]=0;
       q.push(n);
       int x;
       while(!q.empty()){
           x=q.front();
           if(x==m) return dis[m];
           q.pop();
           if(x+1<=m&&dis[x+1]==-1){
               dis[x+1]=dis[x]+1;
               q.push(x+1);
           }
           if(x-1>=1&&dis[x-1]==-1){
               dis[x-1]=dis[x]+1;
               q.push(x-1);
           }
           if(x<m&&x*x<(m+(m-n))&&dis[x*x]==-1){
               dis[x*x]=dis[x]+1;
               q.push(x*x);
           }
           
       }
   }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值