poj3278(BFS)

作者: 42fighting | 来源:发表于2018-01-25 15:32 被阅读0次

    kuangbin带你飞专题:poj3278
    题目含义:给你N,M,用N-1,N+1,N2的三种方式找出经过若干次跳跃变为M的最小次数。例如5->17,如图。

    讨论
    经过四次即可。
    题解:通过bfs将N-1,N+1,2
    N,作为N的子节点依次进入队列即可,最先找到的节点即为答案,解答树如下。
    解答树
    ac代码:
    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <string.h>
    using namespace std;
    int N, M;
    const int maxn=200000;
    int dis[maxn];
    int vis[maxn];
    int bfs()
    {
        queue<int> que;
        que.push(N);
        vis[N]=1;
        if(N==M)return 0;
        while(!que.empty())
        {
            int x=que.front();
            que.pop();
            int nx=x+1, ny=x*2, nz=x-1;
            if(nx==M||ny==M||nz==M)
            return dis[x]+1;
            else {
                if(nx<=2*max(M, N)&&nx>=0&&!vis[nx])
                {
                    vis[nx]=1;
                    que.push(nx);
                    dis[nx]=dis[x]+1;
                }
                if(ny<=2*max(M, N)&&ny>=0&&!vis[ny])
                {
                    vis[ny]=1;
                    que.push(ny);
                    dis[ny]=dis[x]+1;
                }
                if(nz<=2*max(M, N)&&nz>=0&&!vis[nz])
                {
                    vis[nz]=1;
                    que.push(nz);
                    dis[nz]=dis[x]+1;
                }
            }
        }
        return -1;
    }
    int main(void)
    {
        while(scanf("%d%d", &N, &M)!=EOF)
        {
            memset(vis, 0, sizeof(vis));
            memset(dis, 0, sizeof(dis));
            int res=bfs();
            printf("%d\n", res);
        }
        return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:poj3278(BFS)

        本文链接:https://www.haomeiwen.com/subject/qrpvaxtx.html