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;
}

 

posted @ 2013-06-21 13:41  fangguo  阅读(264)  评论(0编辑  收藏  举报