题目链接:http://poj.org/problem?id=3278
大意:牛和人在一条直线上,人可以往左走,也可以往右走,还可以直接跳到两倍的地方。然后求最短花多少时间能捉到牛。明显的bfs。再次复习下。
背景:一开始TLE没有return,直接超时,,自己简直脑残。。然后还是wa,发现居然直接写成了cur.x = 5。。。真想撞墙。。改了后ac
代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct state
{
int x;
int time;
}cur,next1;
int n,k;
int d[2] = {1,-1};
int visit[100001];
void bfs(state temp)
{
queue<state> q;
temp.time = 0;
visit[temp.x] = 1;
q.push(temp);
while(!q.empty())
{
cur = q.front();
if(cur.x == k)
{
cout << cur.time << endl;
return ; //一开始居然return忘了。。。TLE妥妥的。。
}
for(int i = 0;i < 2;i++)
{
next1.time = cur.time + 1;
next1.x = cur.x + d[i];
if(next1.x>=0 && next1.x<=100000 &&!visit[next1.x])
{
visit[next1.x] = 1;
q.push(next1);
}
}
if(cur.x>=0 && cur.x*2<=100000) //增加一种跳到2倍位置的情况 (约束条件)
{
next1.time = cur.time + 1;
next1.x = cur.x * 2;
visit[next1.x] = 1;
q.push(next1);
}
q.pop();
}
}
int main ()
{
while(cin >> n >> k)
{
memset(visit,0,sizeof(visit));
cur.x = n; //一开始手残写成cur.x = 5; wa妥妥的```
bfs(cur);
}
return 0;
}