poj 3278 Catch That Cow 优化深搜
这题的思想很简单,就是每次找出队列里面花费时间最少的来走下一步,这样当我们找到k点后,所花费的时间一定是最少的。
但要用一个标记数组vis[200010],用来标记是否走过。否则会内存溢出。
#include<queue> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int vis[200010]; struct Point{ int position,Time; Point(int a,int b) { position=a;Time=b; vis[a]=1; } int operator <(const Point &temp) const { return Time>temp.Time; } }; priority_queue<Point> q; int bfs(int n,int k) { while(!q.empty()) q.pop(); memset(vis,0,sizeof(vis)); Point p(n,0); q.push(p); while(!q.empty()) { p=q.top(); q.pop(); if(p.position==k) return p.Time; if(p.position>k) { if(!vis[p.position-1]) q.push(Point(p.position-1,p.Time+1)); } else if(p.position>=0) { if(p.position) if(!vis[p.position-1]) q.push(Point(p.position-1,p.Time+1)); if(!vis[p.position+1]) q.push(Point(p.position+1,p.Time+1)); if(!vis[p.position*2]) q.push(Point(p.position*2,p.Time+1)); } } return 0; } int main() { int n,k,i,j; while(scanf("%d%d",&n,&k)!=EOF) { printf("%d\n",bfs(n,k)); } return 0; }