第一次写这种题,参考一下网上的代码。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 int dir[][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}};    //四个方向
 6 int n, m;
 7 const int MAXN = 105;
 8 struct Node
 9 {
10     int x, y, time;
11     friend bool operator<(Node a, Node b)            //重载
12     {
13         return a.time > b.time;
14     }
15 };
16 struct cmap
17 {
18     char c;
19     int nx, ny;
20 }map[MAXN][MAXN];
21 int fight[MAXN][MAXN], vis[MAXN][MAXN];              //fight用来标记有monster的HP
22 int bfs()
23 {
24     Node now, next;
25     std::priority_queue<Node> q;
26     now.x = n - 1, now.y = m - 1;
27     char s = map[now.x][now.y].c;
28     if (s>='1' && s<= '9')
29     {
30         now.time = map[now.x][now.y].c - '0';
31         fight[now.x][now.y] = map[now.x][now.y].c - '0';
32     }
33     else
34         now.time = 0;
35     q.push(now);
36     while (!q.empty())
37     {
38         now = q.top();
39         q.pop();
40         if (now.x == 0 && now.y == 0)
41             return now.time;
42         for (int i = 0; i < 4; ++i)
43         {
44             next.x = now.x + dir[i][0];
45             next.y = now.y + dir[i][1];
46             if (next.x>=0 && next.x<n && next.y>=0 && next.y<m && 
47                     map[next.x][next.y].c != 'X' && !vis[next.x][next.y])
48             {
49                 vis[next.x][next.y] = 1;
50                 s = map[next.x][next.y].c;
51                 if (s>='1' && s<='9')
52                 {
53                     next.time = now.time + s - '0' + 1;
54                     fight[next.x][next.y] = s - '0';
55                 }
56                 else
57                     next.time = now.time + 1;
58                 map[next.x][next.y].nx = now.x;
59                 map[next.x][next.y].ny = now.y;
60                 q.push(next);
61             }
62         }
63     }
64     return -1;
65 }
66 int main()
67 {
68     while (scanf("%d %d", &n, &m) != EOF)
69     {
70         for (int i = 0; i < n; ++i)
71             for (int j = 0; j < m; ++j)
72                 std::cin >> map[i][j].c;
73         memset(vis, 0, sizeof(vis));
74         memset(fight, 0, sizeof(fight));
75         int ans = bfs();
76         if (ans != -1)
77         {
78             printf("It takes %d seconds to reach the target position, let me show you the way.\n", ans);
79             int num = 1, x = 0, y = 0;
80             while (num <= ans)
81             {
82                 int fx = map[x][y].nx, fy = map[x][y].ny;
83                 printf("%ds:(%d,%d)->(%d,%d)\n", num++, x, y, fx, fy);
84                 for (int t = 1; t <= fight[fx][fy]; ++t)
85                     printf("%ds:FIGHT AT (%d,%d)\n", num++, fx, fy);
86                 x = fx, y = fy;
87             }
88         }
89         else
90             printf("God please help our poor hero.\n");
91         printf("FINISH\n");
92     }
93     system("pause");
94     return 0;
95 }
posted on 2013-04-20 15:04  PegasusWang  阅读(177)  评论(0)    收藏  举报