描述
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.
输入
输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
输出
对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。
样例输入
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.
![](https://i-blog.csdnimg.cn/blog_migrate/880a27e456df3c7e1054e93278fd2db6.png)
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
8 8 .@##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...### 6 5 .*.#. .#... ..##. ..... .#... ....@ 9 6 .#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #.@.## .#..#. 0 0
样例输出
10 8 -1
迷宫问题掌握了技巧就不难了 。首先每个点都有4种方向可以走(在能走的情况下),走过的路我们给他一个计步,用二维数组step[][],首先先把每个点的步数设置为最大,起点为0,纪录每个到达地方的步数。如果到达一个点的步数小于当前点值,替换。直到最后输出终点坐标对应的step[][]值
#include<iostream>
using namespace std;
int step[21][21];
char a[21][21];
int q1, q2, z1, z2;
int n, m;
int pd(int i, int j){
if (i < 0 || j < 0 || i >= n || j >= m || a[i][j] == '#')
return 0;
return 1;
}
void f(int i, int j){
int x = step[i][j];
if (pd(i + 1, j)){
if (x + 1 < step[i + 1][j]){
step[i + 1][j] = x + 1;
f(i + 1, j);
}
}
if (pd(i, j+1)) {
if (x + 1 < step[i][j + 1]){
step[i][j + 1] = x + 1;
f(i, j + 1);
}
}
if (pd(i - 1, j)){
if (x + 1 < step[i - 1][j]) {
step[i - 1][j] = x + 1;
f(i - 1, j);
}
}
if (pd(i, j - 1)){
if (x + 1 < step[i][j - 1]){
step[i][j - 1] = x + 1;
f(i, j - 1);
}
}
}
int main(){
while (1){
for (int i = 0; i < 21; i++){
for (int j = 0; j < 21; j++)
step[i][j] = 1000;
}
scanf("%d %d", &n, &m);
if (n == 0 && m == 0)
break;
getchar();
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++) {
cin >> a[i][j];
if (a[i][j] == '@') {
q1 = i;
q2 = j;
}
if (a[i][j] == '*') {
z1 = i;
z2 = j;
}
}
}
step[q1][q2] = 0;
f(q1, q2);
if (step[z1][z2] == 1000)
printf("-1\n");
else
printf("%d\n", step[z1][z2]);
}
return 0;
}