大家小的时候都玩过迷宫的游戏,迷宫里面有障碍物有一个出口,和一个入口,通过入口,走到出口,你就找到一条路线。
package 中介者设计模式; import java.util.Scanner; public class MainMain { private static int col = 0; private static int row = 0; //地图 private static int a[][] = new int[50][50]; //标记地图中的点 private static int book[][] = new int[50][50]; //路径的个数 private static int min = 99999; //读入入口的坐标 static int startx = 0; static int starty = 0; //读入出口的坐标 static int endx = 0; static int endy = 0; public static void main(String[] args) { for (int i = 0;i<a.length;i++) { for (int j = 0;j<a[i].length;j++) { a[i][j]=0; book[i][j]=0; } } Scanner input = new Scanner(System.in); row = input.nextInt();//行 col = input.nextInt();//列 //读入地图 for (int i = 1; i<=row;i++) { for (int j = 1;j<=col;j++) { a[i][j] = input.nextInt(); } } //读入入口的坐标 startx = input.nextInt(); starty = input.nextInt(); //读入出口的坐标 endx = input.nextInt(); endy = input.nextInt(); //从入口的位置开始搜索 book[startx][starty] = 1;//标记为1代表已经在路径中,防止以后重复走,0代表还没有走。 dfs(startx,starty,0); System.out.println(min); } private static void dfs(int startx, int starty, int step) { //定义一个方向数组 int next[][] = {{0,1},//代表右 {1,0},//代表下 {0,-1},//代表左 {-1,0}//代表上 }; //判断是不是到达出门的位置 if (startx == endx && starty == endy) { //更新路线的值 if (step < min) { min = step; } return ; } //试探4个方向的走法 for (int i = 0;i<=3; i++) { //计算下一个点的坐标的值 int tx = startx+next[i][0]; int ty = starty+next[i][1]; //判断是不是越界 if (tx < 1|| tx > row || ty<1||ty>col) { continue; } if (a[tx][ty] == 0 && book[tx][ty] == 0) { book[tx][ty] = 1; dfs(tx,ty,step+1); book[tx][ty] = 0; } } return; } }
首先我们要写这个算法的时候,首先要知道,在迷宫中我需要知道那些属性,比如我需要知道方向,方向用什么表示,在这里我们是用一个二维数组表示
int next[][] = {(0,1),(1,0),(-1,0),(0,-1)}
如果大家看不懂的话可以画图。比如
1,2
2,1 2,2 2,3
3,2
看出来了把2,2是如何变成1,2的是不是横坐标的值减少1是不是对应着(-1,0)代表向上。
还有一点这个算法其实跟我们之前讲解的算法框架是一样的都是,递归求解,找到一个结束的条件,和递归的条件
算法框架:
void dfs () {
if(判断是不是结束的条件){
XXXX;
XXX;
return ;//这个不要忘记了
}else {
//条件(比如标记啊什么的)
dfs();
//条件(恢复设置啊什么的);
}
}
是不是瞬间感觉清楚了很多!!