hduoj 1242 Rescue

这是假期集训时,周赛拉的一道比赛题目,当时还有一道情况更加复杂的广搜题目,经过WA5次之后,终于A了,然后看到这道题时,感觉可以把他轻松解决掉。

    写完了初步的代码,提交,WA了,找不到原因,后来发现,是因为搜到第一个就输出出来了,没有考虑到最小值,当初深搜深入研究的时候就有这个问题忘记考虑,然后又标记了一个变量,考虑的是全广搜完,然后找到其中的最小值,提交还是WA,然后就没辙了,,,

    最后去做其他的题目了。。

    比赛完之后回头看这道题,队友们告诉我,要用到优先队列,,,好吧,基础没有打牢~~~~

    然后就去查了查优先队列,过了。。。


    后来才想到自己一开始标记的为什么WA,因为当遍历一次后,就会被标记,从而不能再次访问。

    附上AC的代码:

#include
#include
#include
using namespace std;

struct move
{
    friend bool operator < (struct move a,struct move b)
    {
        return a.time>b.time;
    }
    int x;
    int y;
    int time;
};
char map[300][300];
int vis[300][300];
int divs[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
int flag;
int sx,sy;
int ex,ey;
int res;

void bfs()
{
    priority_queue Q;
    move p,q;
    p.x=sx;
    p.y=sy;
    p.time=0;
    vis[p.x][p.y]=1;
    Q.push(p);
    while(!Q.empty())
    {
        p=Q.top();
        if(p.x==ex&&p.y==ey)
        {
            res=p.time;
            flag=1;
            return ;
        }
        for(int i=0; i<4; i++)
        {
            q.x=p.x+divs[i][0];
            q.y=p.y+divs[i][1];
            q.time=p.time+1;
            if(q.x>=0&&q.y>=0&&q.x



你可能感兴趣的:(图论_搜索)