NC202589 魔法数字

题目链接

题目

题目描述

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

返回最少需要的操作数。

示例1

输入

3,10

返回值

2

备注

\((1\leq n,m\leq1000)\)

题解

知识点:BFS,数学。

显然用bfs,不过要注意限制条件,只有小于目标时才能加法和乘方,其中乘方的结果不能超过 \(1024\);减法结果不能小于 \(0\)

时间复杂度 \(O(1)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>

using namespace std;


int vis[1200];
void bfs(int n, int m) {
    queue<int> q;
    q.push(n);
    vis[n] = 0;
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        if (cur == m) return;
        if (cur < m) {
            if (!vis[cur + 1]) {
                q.push(cur + 1);
                vis[cur + 1] = vis[cur] + 1;
            }
            if (cur * cur <= 1024 && !vis[cur * cur]) {
                q.push(cur * cur);
                vis[cur * cur] = vis[cur] + 1;
            }
        }
        if (!vis[cur - 1]) {
            q.push(cur - 1);
            vis[cur - 1] = vis[cur] + 1;
        }
    }
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n, m;
    cin >> n >> m;
    bfs(n, m);
    cout << vis[m] << '\n';
    return 0;
}
posted @ 2022-07-16 16:46  空白菌  阅读(32)  评论(0编辑  收藏  举报