少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵 岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M x N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
输入格式
第一行输入两个非零整数M和N,两者均不大于20。M示迷阵行数N表示迷阵列数。
接下来有M行,每行包含N个字符,不同字符分别代表不同含义:(1) ‘@’:少年李逍遥所在的位置; (2) ”可以安全通行的方格; (3) ‘#’:有怪物的方格; (4) *:仙药所在位置。
输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药则输出-1。
输入样例1:
8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
输出样例1:
10
输入样例2:
6 5
.*.#.
.#...
..##.
.....
.#...
....@
输出样例2:
8
代码运行超时。
有大佬知道如何剪枝欢迎留言一起讨论。
#include <iostream>
using namespace std;
const int N = 25;
char s[N][N];
bool vis[N][N];
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int ans = 999999;
int m, n;
void dfs(int x, int y, int step)
{
if (s[x][y] == '#' || x < 0 || x >= m || y < 0 || y >= n)
{
return;
}
if (step > ans)
{
return;
}
if (s[x][y] == '*')
{
ans = min(ans, step);
}
for (int i = 0; i < 4; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (!vis[x][y])
{
vis[x][y] = 1;
dfs(tx, ty, step + 1);
vis[x][y] = 0;
}
}
}
int main()
{
cin >> m >> n;
for (int i = 0; i < m; i++)
{
scanf("%s", s[i]);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (s[i][j] == '@')
{
dfs(i, j, 0);
break;
}
}
}
if (ans == 999999)
{
cout << -1 << endl;
}
else
{
cout << ans << endl;
}
return 0;
}