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