【dfs】java实现迷宫问题(深度优先搜索)
黑色代表障碍物
白色代表空地
要求输入:
m行n列
地图
起始坐标 终点坐标
输出:
最短路径长度
例如:
输入:
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出:
7
import java.util.Scanner;
public class migong {
static int startx,starty, m,n,endx,endy,min=999;
static int[]dx=new int[]{0,1,0,-1};
static int[]dy=new int[]{1,0,-1,0};
static int[][]map=new int[100][100];//地图
static int[][]vis=new int[100][100];//访问数组,用于记录某地是否已被访问
public static void dfs(int x,int y,int step) {
if(x==endx&&y==endy) {//搜索到终点则记录最小值
if(step<min) {
min=step;
}
return;
}
for(int i=0;i<4;i++) {//顺时针,上右下左
int tx=x+dx[i];
int ty=y+dy[i];
if(map[tx][ty]==1&&vis[tx][ty]==0) {//如果遇到的是空地且未访问过
vis[tx][ty]=1;//先设置此地为已访问
dfs(tx,ty,step+1);//接着开始dfs,且step+1
vis[tx][ty]=0;//回溯时要设置为未访问
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
m=sc.nextInt();
n=sc.nextInt();
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++) {
map[i][j]=sc.nextInt();//1表示空地,2表示障碍物
}
startx=sc.nextInt();//输入起点x轴坐标
starty=sc.nextInt();//输入起点y轴坐标
endx=sc.nextInt();//输入终点x轴坐标
endy=sc.nextInt();//输入终点y轴坐标
vis[startx][starty]=1;//设置起点坐标为已访问
dfs(startx,starty,0);//开始dfs
System.out.println(min);//输出最短路径长度
}
}
/*
输入:
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出:
7
*/