ZOJ 1649 解题报告

来源:互联网 发布:淘宝买到质量问题 编辑:程序博客网 时间:2024/06/04 08:38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
首先有坑的地方是friends,对嘛,朋友有很多,angel只有一个。所以更好的处理办法就是以angel为起点。
 
其次是杀死guard并走到其位置上需要2mins,这样就违背了BFS等距离向外扩展的原理
 
所以用队列的话,可以把杀死guard和走到其位置上看成两个步骤,入队两次。
 
优先队列就简单了,直接以时间从小到大建立优先级就好了。
下面给出优先队列代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
int n , m;
int dx[]= {0,0,1,-1};
int dy[]= {1,-1,0,0};
char s[205][205];
typedef struct p
{
    int x,y,t;
    bool operator < (const p & a) const//运算符重载,自定义优先级
    {
        return t>a.t;//取时间最少优先
    }
} Point;
int BFS(int x , int y)
{
    priority_queue<Point> Q;//优先队列
    Point in ,out;
    in.x = x;
    in.y = y;
    in.t = 0;
    s[x][y] = '#';
    Q.push(in);
    while(!Q.empty())
    {
        in = Q.top();
        Q.pop();
        for(int  i= 0 ; i < 4; i++)
        {
            int xx = in.x + dx[i];
            int yy = in.y + dy[i];
            if(xx < 0 || xx == n || yy < 0 || yy == m || s[xx][yy] == '#'continue;
            if(s[xx][yy]=='r')   return  in.t+1;
            if(s[xx][yy] == '.')
            {
                s[xx][yy] = '#';
                out.x = xx;
                out.y = yy;
                out.t = in.t + 1;
            }
            else if(s[xx][yy]=='x')
            {
                s[xx][yy] = '#';
                out.x = xx;
                out.y = yy;
                out.t = in.t + 2;
            }
            Q.push(out);
        }
    }
    return -1;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int x , y ;
        for(int i = 0 ; i < n; i++)
        {
            scanf("%s",s[i]);
            for(int j = 0 ; j <m; j++)
                if(s[i][j]=='a')
                {
                    x = i;
                    y = j;
                }
        }
        int time = BFS(x,y);
        if(time==-1) printf("Poor ANGEL has to stay in the prison all his life.\n");
        else printf("%d\n",time);
    }
    return 0;
}
0 0
原创粉丝点击