Hdu 1242 Rescue

来源:互联网 发布:淘宝上有意思的小东西 编辑:程序博客网 时间:2024/05/21 21:42

有一个关键点没注意到,这个题目求的是最短时间而不是最短距离,杀守卫那个点花2分钟,距离可能最短,但时间不是最优。

另外其实从a搜r或者r搜a没有区别,代码都能过的

所以要用优先队列。又学了一下C++。。。

/*ID: Daniel.20PROG: mainLANG: C++*/#include <algorithm>#include <iostream>#include <sstream>#include <string>#include <queue>#include <list>#include <set>#include <map>#include <cmath>#include <vector>#include <cctype>#include <cstring>#include <fstream>using namespace std;const int maxint=0x7FFFFFFF;const long long maxlonglong=0x7FFFFFFFFFFFFFFFLL;     int n,m;char arr[220][220];int sx,sy;int mark[220][220];//int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};struct node{    int x,y,step;    friend bool operator < (node a, node b){        return a.step>b.step;    }};bool ok(int x, int y){    if(x>=n||x<0||y>=m||y<0) return false;    if(arr[x][y]!='r'&&arr[x][y]!='a'&&arr[x][y]!='x'&&arr[x][y]!='.')        return false;    if(mark[x][y]) return false;    return true;}int bfs(){    priority_queue<node> q;    node st={sx,sy,0};    q.push(st);    while(!q.empty()){        node tmp = q.top();        q.pop();        if(arr[tmp.x][tmp.y]=='r'){            return tmp.step;        }        for(int i=0;i<4;i++){            int nx=tmp.x+dir[i][0];            int ny=tmp.y+dir[i][1];            if(!ok(nx,ny)) continue;            node next={nx,ny,tmp.step+1};            if(arr[nx][ny]=='x') next.step++;            mark[nx][ny]=1;            q.push(next);        }    }    return -1;}int main(){    while(scanf("%d%d", &n, &m)!=EOF){        for(int i=0;i<n;i++){            scanf("%s", arr[i]);            for(int j=0;j<m;j++){                if(arr[i][j]=='a'){                    sx=i;sy=j;                }            }        }        memset(mark,0,sizeof mark);        mark[sx][sy]=1;        int result=bfs();        if(result==-1){            cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;        }else{            cout<<result<<endl;        }    }    return 0;}


0 0