HDOJ 1026 Ignatius and the Princess I

经典BFS+记忆表

 

解题思路:

因为存在具有Hp为n的monster存在,如果直接压入队列,就有可能破坏广度优先树,因此必须在处理的过程中保证monster和‘.’的处理是保存同步的,

处理方法:如果当前位置是monster,那么我就削减他一个HP,再压入队尾,直到HP为0时,把地图上monster的位置置为‘.’可行位置,这样一来,monster

和‘.’的处理就同步了

路径记录:运用到算法导论上的记忆化BFS,具体的操作是建立一个记忆表

 

// 一次AC  0MS  444K

  1 #include <queue>
2 #include <stdio.h>
3 #include <memory.h>
4 using namespace std;
5
6 const int maxn = 110;
7 char maze[maxn][maxn];
8 int nNum, mNum, cnt, vis[maxn][maxn];
9 int dx[] = {-1, 1, 0, 0};
10 int dy[] = {0, 0, -1, 1};
11
12 struct node
13 {
14 int x, y, hp, step;
15 };
16
17 struct parent
18 {
19 int px, py, pp;
20 }prev[maxn][maxn];
21
22 bool IsInBound(int x, int y)
23 {
24 if (x<0 || y<0 || x>=nNum || y>=mNum)
25 {
26 return false;
27 }
28
29 return true;
30 }/* IsInBound */
31
32 void dfs(int x, int y, int pp)
33 {
34 if (prev[x][y].px+prev[x][y].py != 0)
35 dfs(prev[x][y].px, prev[x][y].py, prev[x][y].pp);
36
37 int px = prev[x][y].px;
38 int py = prev[x][y].py;
39
40 printf("%ds:(%d,%d)->(%d,%d)\n", cnt++, px, py, x, y);
41 for (int i=1; i<=pp; ++i)
42 printf("%ds:FIGHT AT (%d,%d)\n", cnt++, x, y);
43 }/* dfs */
44
45 void bfs()
46 {
47 bool IsSolve = false;
48 queue <node> q;
49 struct node cur, next;
50
51 cur.x = 0;
52 cur.y = 0;
53 cur.step = 0;
54 cur.hp = 0;
55 q.push(cur);
56
57 vis[0][0] = 1;
58 while (!q.empty())
59 {
60 cur = q.front();
61 q.pop();
62
63 if (cur.x==nNum-1 && cur.y==mNum-1
64 && maze[cur.x][cur.y]=='.')
65 {
66 IsSolve = true;
67 printf("It takes %d seconds to reach the target position, let me show you the way.\n", cur.step);
68
69 cnt = 1;
70 dfs(cur.x, cur.y, cur.hp);
71 }/* End of If */
72
73 if (maze[cur.x][cur.y]>='1' && maze[cur.x][cur.y]<='9')
74 {
75 int tmp = maze[cur.x][cur.y] - '1';
76
77 if (tmp == 0)
78 maze[cur.x][cur.y] = '.';
79 else
80 maze[cur.x][cur.y] = tmp + '0';
81
82 ++cur.step;
83 q.push(cur);
84 }/* End of If */
85 else
86 {
87 for (int i=0; i<4; ++i)
88 {
89 next.x = cur.x + dx[i];
90 next.y = cur.y + dy[i];
91 next.step = cur.step + 1;
92
93 if (!vis[next.x][next.y] && IsInBound(next.x, next.y)
94 && maze[next.x][next.y]!='X')
95 {
96 vis[next.x][next.y] = 1;
97 prev[next.x][next.y].px = cur.x;
98 prev[next.x][next.y].py = cur.y;
99 prev[next.x][next.y].pp = cur.hp;
100
101 if (maze[next.x][next.y] == '.')
102 next.hp = 0;
103 else
104 next.hp = maze[next.x][next.y] - '0';
105
106 q.push(next);
107 }
108 }/* End of For */
109 }/* End of Else */
110 }/* End of While */
111 if (!IsSolve)
112 {
113 printf("God please help our poor hero.\n");
114 }
115 }/* bfs */
116
117 int main()
118 {
119 while (~scanf("%d %d", &nNum, &mNum))
120 {
121 memset(vis, 0, sizeof(vis));
122 memset(maze, 0, sizeof(maze));
123 memset(prev, 0, sizeof(prev));
124
125 for (int i=0; i<nNum; ++i)
126 scanf("%s", maze[i]);
127
128 bfs();
129 printf("FINISH\n");
130 }/* End of While */
131
132 return 0;
133 }


 

你可能感兴趣的:(NAT)