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;

}

 

你可能感兴趣的:(catch)