看题 想到搜索 写了一下深搜爆栈 害 虽然不愿意 但是还是得写广搜了(广搜写的少 不太熟练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];
}
};
京公网安备 11010502036488号