bfs,需要注意0和N是可以到达的,除此之外也可以到达,但实际上不可能更优,因为超过这个范围表明需要回退,回退的步数超过2时,完全可以多走几步再翻倍,结果更优。

# include <cstdio>
# include <queue>
# include <cstring>

using namespace std;

# define MAXN 100000 + 5
# define N 100000 + 1
int n, k;
char vis[MAXN];
int d[MAXN];

int bfs(void)
{
    queue <int> Q;

    memset(vis, 0, sizeof(vis))    ;

    vis[n] = 1, d[n] = 0;
    Q.push(n);
    while (!Q.empty())
    {
        int x = Q.front(); Q.pop();
        if (x == k) return d[x];
        if (x-1>=0 && !vis[x-1]) {vis[x-1] = 1;Q.push(x-1);d[x-1] = d[x]+1;}
        if (x+1<N && !vis[x+1]) {vis[x+1] = 1;Q.push(x+1);d[x+1] = d[x]+1;}
        if (x*2<N && !vis[x*2]) {vis[x*2] = 1;Q.push(x*2); d[x*2] = d[x]+1;}
    }

    return -1;
}

void solve(void)
{
    printf("%d\n", bfs());
}

int main()
{
    while (~scanf("%d%d", &n, &k))
    {
        solve();
    }

    return 0;
}

相关文章:

  • 2022-01-02
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-18
  • 2021-11-13
  • 2021-07-21
  • 2021-12-04
  • 2021-10-04
相关资源
相似解决方案