题目:http://acm.hdu.edu.cn/showproblem.php?pid=2717
Problem Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
这道题本来很简单,叫我想复杂了,o(╯□╰)o囧啊。。。。
没想到暴力BFS就可以过。
我还在想 VIS数组是否有优化的选择,比如 用终点和当前点的距离差做标准等。。。
结果一直超内存。。。
后来,想干脆暴搜一次看看,
结果因为,我判断没写函数,直接判断,
if(vis[k.x]==0 && k.x>=0 && k.x<=100000)
因为if里的顺序问题,一直越界错误。。。(应该让判断范围在 判断数组内容前面)
然后又因为判断与0,100000 落了等号。。又WA一次。。
这个简单的题目,悲剧了好长时间。。。想哭了的说。。。
#include <iostream> #include <queue> #include <string.h> using namespace std; int finish; bool vis[100011]; struct Coor { int x,step; }; bool judge(int x) { if(x<0 || x>100000) return 0; if(vis[x]==1) return 0; return 1; } int bfs(int start) { memset(vis,0,sizeof(vis)); queue <Coor> q; Coor t,k; vis[start]=1; t.x=start; t.step=0; q.push(t); while(!q.empty()) { t=q.front(); q.pop(); if(t.x==finish) return t.step; k.x=t.x+1; if(judge(k.x)) { k.step=t.step+1; vis[k.x]=1; q.push(k); } k.x=t.x-1; if(judge(k.x)) { k.step=t.step+1; vis[k.x]=1; q.push(k); } k.x=t.x*2; if(judge(k.x)) { k.step=t.step+1; vis[k.x]=1; q.push(k); } } return -1; } int main() { int start; while(cin>>start>>finish) { cout<<bfs(start)<<endl; } return 0; }