传统数据结构和算法

poj3278(BFS)

2018-01-25  本文已影响0人  42fighting

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;
}

上一篇下一篇

猜你喜欢

热点阅读