1題目編號:1012
2 題目內容:
3 解題思路形成過程:BFS。之前理解錯題意,以爲每次只有一個‘r’,所以WA了,後來想起了上週上課講的例題,和這個題非常相似,思路也應該是一樣的,即可以有多個‘r’的,這樣按原來把‘r’作爲起始點開始搜索的思路就錯誤了,因爲不知道從哪個‘r’開始會取得最短時間,而且多個‘r’儲存和操作起來也比較麻煩,所以後來換了一個思路:如果某一個r能找到a,那麼a一定能找到這個r 。這樣以來我們不必從多個r同時出發去找a,可以直接讓a去找離他最近的就行了!按照這思路就容易多了…
4 代碼:#include<stdio.h>
#include<queue>
using namespace std;
typedef struct
{
int i, j, time;
}point;
int n, m;
int dir[4][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
char map[201][201];
point start;
int bfs(point start)
{
queue<point>q;
int i;
point cur, next;
start.time = 0;
map[start.i][start.j] = '#';
q.push(start);
while (!q.empty())
{
cur = q.front();
q.pop();
for (i = 0; i<4; i++)
{
next.i = cur.i + dir[i][0];
next.j = cur.j + dir[i][1];
if (map[next.i][next.j] == 'r')
{
return cur.time + 1;
}
if (next.i >= 0 && next.i<n&&next.j >= 0 && next.j<m)
if (map[next.i][next.j] != '#')
{
if (map[next.i][next.j] == 'x')
{
map[next.i][next.j] = '#';
next.time = cur.time + 2;
q.push(next);
}
else
{
map[next.i][next.j] = '#';
next.time = cur.time + 1;
q.push(next);
}
}
}
}
return -1;
}
int main()
{
int i, j;
while (scanf("%d %d", &n, &m) != EOF)
{
getchar();
bool flag = true;
for (i = 0; i<n; i++)
{
for (j = 0; j<m; j++)
{
scanf("%c", &map[i][j]);
if (map[i][j] == 'a')
{
start.i = i;
start.j = j;
}
}
getchar();
}
int T = bfs(start);
if (T >= 0)
printf("%d\n", T);
else
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
return 0;
}