前言
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M \times NM×N 个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
输入格式
第一行输入两个非零整数 MM 和 NN,两者均不大于 2020。MM 表示迷阵行数, NN 表示迷阵列数。
接下来有 MM 行, 每行包含 NN 个字符,不同字符分别代表不同含义:
1) '@':少年李逍遥所在的位置;2) '.':可以安全通行的方格;3) '#':有怪物的方格;4) '*':仙药所在位置。
输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1−1。
Sample Input
8 8 .@##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...###
Sample Output
10
Sample Input 2
6 5 .*.#. .#... ..##. ..... .#... ....@
Sample Output 2
8
Sample Input 3
9 6 .#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #.@.## .#..#.
Sample Output 3
-1
代码参看如下,解释放在代码中了
#include<iostream>
#include<queue>
using namespace std;
int x,y;//表示李逍遥的位置
int mx,my;//仙药的位置
int m,n;//m是行 n是列
char map[30][30];
bool vis[30][30];//判断是否来过
bool in(int x,int y)
{//判断是否越界
return 0<=x&&x<m && 0<=y&&y<n;
}
struct pos
{
int x;
int y;//当前位置
int s;//距离出发点的距离
}cur,nex;
queue<pos> q;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int minn;
int bfs(int x,int y)
{
vis[x][y]=1;
cur.x=x;
cur.y=y;
cur.s=0;
q.push(cur);
while(q.size())
{
cur=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int dx=cur.x+dir[i][0];
int dy=cur.y+dir[i][1];
//如果是重点就会返回距离,这里用的return表示第一次出现
//以后就会结束,这是后所走步数最少
if(dx==mx&&dy==my)
return cur.s+1;
//不是终点但是是满足条件的点,在范围内,是. 没有走过;
if(in(dx,dy) && !vis[dx][dy] && map[dx][dy]=='.')
{
vis[dx][dy]=1;
nex.x=dx,nex.y=dy,nex.s=cur.s+1;
q.push(nex);
}
}
}
return -1;
}
int main()
{
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
cin>>map[i][j];
if(map[i][j]=='@')
{
x=i;
y=j;
}
else if(map[i][j]=='*')
{
mx=i;
my=j;
}
}
cout<<bfs(x,y);
return 0;
}