poj3278(BFS)
2018-01-25 本文已影响0人
42fighting
kuangbin带你飞专题:poj3278
题目含义:给你N,M,用N-1,N+1,N2的三种方式找出经过若干次跳跃变为M的最小次数。例如5->17,如图。
经过四次即可。
题解:通过bfs将N-1,N+1,2N,作为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;
}