仙岛求药
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M imes NM×N 个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
输入格式
第一行输入两个非零整数 MM 和 NN,两者均不大于 2020。MM 表示迷阵行数, NN 表示迷阵列数。
接下来有 MM 行, 每行包含 NN 个字符,不同字符分别代表不同含义:
- ‘@’:少年李逍遥所在的位置;2) ‘.’:可以安全通行的方格;3) ‘#’:有怪物的方格;4) ‘*’:仙药所在位置。
输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1−1。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
样例输出1
10
样例输入2
6 5
.*.#.
.#...
..##.
.....
.#...
....@
样例输出2
8
样例输入3
9 6
.#..#.
.#.*.#
.####.
..#...
..#...
..#...
..#...
#.@.##
.#..#.
样例输出3
-1
import java.util.LinkedList;
import java.util.Scanner;
public class 仙岛求药 {
static int N = 3000;//N需开大点
static int r,c;
static char[] [] map = new char[N][N];//用于保存地图
static boolean [] [] vis = new boolean[N][N];//标识是否访问过的点
static int [] []dir = {{-1,0},{1,0},{0,-1},{0,1}}; //四个方向坐标
static class node{
int x;
int y;
int step;
}
static node [] q = new node[N];
public static void bfs(int sx,int sy,int ex,int ey){
int head=1,tail=1;
boolean flag1 =true;
vis[sx][sy]=true;
node n = new node();
n.x=sx;
n.y=sy;
n.step=0;
q[tail]=n;
tail++;
while(head<tail){
int x = q[head].x;
int y = q[head].y;
int step = q[head].step;
if(x==ex&&y==ey) //终点则输出
{
flag1=false;
System.out.printf("%d
",step);
break;
}
for(int i=0;i<4;i++){
int nx = x+ dir[i][0];
int ny = y +dir[i][1];
if(nx >= 0 && nx < r && ny >= 0 && ny < c && vis[nx][ny] == false && map[nx][ny] == '.'){
vis[nx][ny] = true;
node nn;
if (q[tail]==null){
nn =new node();
}
else {
nn = q[tail];
}
nn.x = nx;
nn.y = ny;
nn.step = step+1;
q[tail]=nn;
tail++;
}
}
head++;
}
if(flag1)
System.out.printf("-1
");
}
public static void main(String[] args) {
int sx = 0,sy=0,ex=0,ey=0;
// while(scanf("%d%d",&r,&c) != EOF && (r||c))
Scanner sc = new Scanner(System.in);
r = sc.nextInt();
c = sc.nextInt();
for (int k=0;k<r;k++){
String s = sc.next();
map[k]=s.toCharArray();
}
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
{
if(map[i][j]=='@'){
sx=i;
sy=j;
}
if(map[i][j]=='*'){
ex=i;
ey=j;
map[i][j]='.';//修改为 点
}
}
bfs(sx,sy,ex,ey);
}
}