魔法数字

题目链接: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);
           }
           
       }
   }
};

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107467654