这道题 挺有意思
每次有 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 second
int 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;
}