本文主要是介绍POJ 3278 简单 BFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这道题 挺有意思
每次有 3 中移动方式,可以前可以后。
问最少移动几次可以抓住牛。
不管是棋盘上怎么移动,这都是个最短路的问题。
而每次的权又都是1 ,完全可以用 BFS 来解决。
我觉得 BFS 中的 used 数组可以用 dist 来代替。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
#define MAX 400000
#define INF 0x3f3f3f3f
#define MS(x) memset(x,0,sizeof(x))
#define ll long long
//#define P pair<int,int>
#define fst first
#define sec secondint dist[MAX*2];
int N,K;
bool bound(int a)
{return a>-110000&&a<110000;
}
int bfs()
{queue<int> q;fill(dist,dist+MAX*2,INF);dist[N+MAX]=0;q.push(N);while(!q.empty()){int v=q.front();q.pop();if(v==K)return dist[K+MAX];if(bound(v*2)&&dist[v*2+MAX]==INF){q.push(v*2);dist[v*2+MAX]=dist[v+MAX]+1;} if(bound(v+1)&&dist[v+1+MAX]==INF){q.push(v+1);dist[v+1+MAX]=dist[v+MAX]+1;} if(bound(v-1)&&dist[v-1+MAX]==INF){q.push(v-1);dist[v-1+MAX]=dist[v+MAX]+1;}} return dist[K+MAX];
}
int main()
{while(scanf("%d%d",&N,&K)!=EOF){int ans=bfs();cout<<ans<<endl;}return 0;
}
这篇关于POJ 3278 简单 BFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!