题目描述
迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标startx,starty以及终点坐标endx,endy。现请你找到一条从起点到终点的最短路径长度。
输入
第一行包含两个整数n,m(1<=n,m<=1000)。接下来 n 行,每行包含m个整数(值1或2),用于表示这个二维迷宫。接下来一行包含四个整数startx,starty,endx,endy,分别表示起点坐标和终点坐标。
输出
如果可以从给定的起点到终点,输出最短路径长度,否则输出-1。
测试数据
输入
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
输出
7
import java.util.Queue;
import java.util.Scanner;
import java.util.LinkedList;
class point {
int x,y,step;
public point(int x,int y,int step){
this.x=x;
this.y=y;
this.step=step;
}
}
public class Bfs {
static int[][] a=new int[50][30];//地图
static int[][] b=new int[50][30];
static int[][] t= {{ 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }};
static int startx,starty,endsx,endsy;
public static void bfs(int x,int y,int step) {
point p=new point(x,y,step);
LinkedList q=new LinkedList();
q.add(p);
b[x][y]=1;
boolean flag=false;
while(!q.isEmpty()) {
point f=q.peek();
if(f.x==endsx&&f.y==endsy) {
flag=true;
System.out.println(f.step);
break;
}
for(int i=0;i<4;i++) {
int newx=f.x+t[i][0];
int newy=f.y+t[i][1];
int newstep=f.step+1;
if(a[newx][newy]==0&&b[newx][newy]!=1&&newx>=1&&newy>=1) {
point newp=new point(newx,newy,newstep);
q.add(newp);
b[newx][newy]=1;
}
}
q.remove();
}
if(flag==false) {
System.out.print(-1);
}
}
// 1 1
// 4 3
// 0 0 1 0
// 0 0 0 0
// 0 0 1 0
// 0 1 0 0
// 0 0 0 1
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
startx=scan.nextInt();
starty=scan.nextInt();
endsx=scan.nextInt();
endsy=scan.nextInt();
for(int i=1;i<6;i++) {
for(int j=1;j<5;j++) {
a[i][j]=scan.nextInt();
}
}
scan.close();
bfs(startx,starty,0);
}
}
体悟:数组一直越界,搞了很长时间才弄明白(中午也没睡觉,现在十分的困倦),原来是犯了在写DFS的错误,数组的默认值为0,开始写的条件之中写的是不为1,即没有访问过就可以往上下左右四个方向移动,但是地图边界也为0,当访问点在边界上的上下左右的时候就数组越界了,所以解决这个问题也可以用下列种形式
import java.util.Queue;
import java.util.Scanner;
import java.util.LinkedList;
class point {
int x,y,step;
public point(int x,int y,int step){
this.x=x;
this.y=y;
this.step=step;
}
}
public class Bfs {
static int[][] a=new int[50][30];//地图
static int[][] b=new int[50][30];
static int[][] t= {{ 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }};
static int startx,starty,endsx,endsy;
public static void bfs(int x,int y,int step) {
point p=new point(x,y,step);
LinkedList q=new LinkedList();
q.add(p);
b[x][y]=2;
boolean flag=false;
while(!q.isEmpty()) {
point f=q.peek();
if(f.x==endsx&&f.y==endsy) {
flag=true;
System.out.println(f.step);
break;
}
for(int i=0;i<4;i++) {
int newx=f.x+t[i][0];
int newy=f.y+t[i][1];
int newstep=f.step+1;
if(a[newx][newy]==0&&b[newx][newy]==1) {
point newp=new point(newx,newy,newstep);
q.add(newp);
b[newx][newy]=2;
}
}
q.remove();
}
if(flag==false) {
System.out.print(-1);
}
}
//1 1
//4 3
//0 0 1 0
//0 0 0 0
//0 0 1 0
//0 1 0 0
//0 0 0 1
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
startx=scan.nextInt();
starty=scan.nextInt();
endsx=scan.nextInt();
endsy=scan.nextInt();
for(int i=1;i<6;i++) {
for(int j=1;j<5;j++) {
a[i][j]=scan.nextInt();
b[i][j]=a[i][j]+1;
}
}
scan.close();
bfs(startx,starty,0);
}
}