1012

题目答题:
救天使啊~谁来救我

思路形成:
看到题目必然广搜啊。
于是乎第一个bug就写出来了,因为没有注意到有可能救不到;
于是乎加上就不到的情况,又一个bug写出来了;
这样如果救不到救近死循环了,原因是没记录走过的位置;
记录位置之后,又一个bug写出来了;
救出来但是并不是次数最少;
于是乎要加上重载小于号;
抄了姜赫的重载发现并没有什么乱用;
回ppt加上了重载,这样应该就没错了吧。
然而我又错了!!!

这就是我写的bug,不知道哪里有问题;

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;

char map[201][201];
int laiguo[201][201];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int sx,sy;
struct A
{
    int x,y;
    int step;
};

int flag;
int n,m;
priority_queue<A> Q;

bool operator<(const A &a,const A &b)
{
    return a.step>b.step;
}
A a,b;
void BFS()
{
    memset(laiguo,0,sizeof(laiguo));
    a.x=sx;
    a.y=sy;
    a.step=0;
    Q.push(a);
    while(Q.size())
    {
        flag=0;
        a=Q.top();
        Q.pop();
        if(map[a.x][a.y]=='r')
        {
            cout<<a.step<<endl;
            flag=1;
            break;
        }
        if(laiguo[a.x][a.y])    continue;
        if(a.x<1||a.x>n||a.y<1||a.y>m)  continue;
        if(map[a.x][a.y]=='#')  continue;

        laiguo[a.x][a.y]=1;

        for(int i=0;i<4;i++)
        {
            if(map[a.x][a.y]=='x')  a.step++;
            b.x=a.x+dir[i][0];
            b.y=a.y+dir[i][1];
            b.step=a.step+1;
            Q.push(b);
        }
    }
    if(!flag)
        cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}

int main()
{
    freopen("nrj.txt","r",stdin);
    while(cin>>n>>m){
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        cin>>map[i][j];
        if(map[i][j]=='a')
        {
            sx=i;
            sy=j;
        }
    }
    BFS();
    return 0;
}
}

你可能感兴趣的:(1012)