看题 想到搜索 写了一下深搜爆栈 害 虽然不愿意 但是还是得写广搜了(广搜写的少 不太熟练emmm)
开两个数组 一个存经过得运算结果 一个存最终某个结果的步数
然后判断条件 剪枝一下
cz为当前所处状态的话
后退时候
存步数a[cz - 1]= a[cz] + 1;
记录结果
b[hzz] = cz - 1;
hzz++;
前进时候
存步数a[cz + 1] = a[cz] + 1;
记录结果
b[hzz] = cz + 1;
hzz++;
翻倍时候
存步数a[cz * cz] = a[cz] + 1;
记录结果
b[hzz] = cz*cz;
hzz++;

class Solution {
public:
int a[110000],b[1100000];
int solve(int n, int m) {
    b[0] = n;
    if (n == m)return 0;

    int qzz=0, hzz=1;
    memset(a, -1, sizeof(a));
    a[n] = 0;
    while (qzz<hzz)
    {
        int cz = b[qzz];
        qzz++;
        if (cz > 1 && -1 == a[cz - 1])
        {
            a[cz - 1]= a[cz] + 1;
            b[hzz] = cz - 1;
            hzz++;
        }
        if (cz +1<=100000 && -1 == a[cz + 1])
        {
            a[cz + 1] = a[cz] + 1;
            b[hzz] = cz + 1;
            hzz++;
        }
        if (1ll*cz*cz <=100000 && -1 == a[cz *cz])
        {
            a[cz * cz] = a[cz] + 1;
            b[hzz] = cz *cz ;
            hzz++;
        }

    }
    return a[m];

}

};