题目链接:http://poj.org/problem?id=3278
题目描述:
萌教主丢了。航神要把他抓回来。萌教主和航神分别在X轴上某点,萌教主不动,航神每次移动的移动方式为:1、前进或后退一步。2、瞬移(当前坐标乘以二)。问最少几次移动抓到萌教主?
解题思路:BFS的最简单题,所以收藏起来作为模板。思路简单,入队出队什么的就做出来了~。
AC代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
queue<int> xx;
int vis[1000050];
int ans;
int bfs(int start,int goal)
{
int cur,next,i,t;
xx.push(start);
vis[start]=1; //起点入队并标注已访问
while(!xx.empty())
{
t=xx.size();
while(t--)
{
cur=xx.front();
xx.pop(); //取出队首元素
if(cur==goal)
return ans; //如果是终点则返回步数值
else
{
for(i=0;i<3;i++)
{
switch(i)
{
case 0:next=cur+1;break;
case 1:next=cur-1;break;
case 2:next=cur*2;break;
} //搜索下三种状态
if(!vis[next]&&next>=0&&next<=100000)
{
xx.push(next);
vis[next]=1; //如果下一种状态未被访问且没有越界则入队。
}
}
}
}
ans++; //步数加一
}
}
int main()
{
memset(vis,0,sizeof(vis));
int start,goal;
cin>>start>>goal;
ans=0;
if(start>=goal)
cout<<start-goal<<endl;
else
cout<<bfs(start,goal)<<endl;
return 0;
}
AC截图: