简单熟悉一下迷宫问题的规则:
如图为一个7x6的迷宫,1代表墙,0代表可以走的路,蓝框为起点,红框为终点,走过的位置不能再走。
如何计算出最短的路线呢?
最笨的方法就是穷举,把所有可以走的路线都走一次,找出所有路线中最终成功到达终点的最短路径。每次走会有四种走法:上、左、下、右,所以可以肯定的是要对走这个行为进行递归,先把这个递归函数写出来。
/*
* @param i 行号
* @param j 列号
* @param index 步数
* @param map 地图
*/
public static void walk(int i,int j,int index,int[][] map) {
for(int n =0;n<4;n++) {
if(n==0) {//向下走
walk(i+1,j,index+1,map);
}else if(n==1) {//向右走
walk(i,j+1,index+1,map);
}else if(n==2) {//向上走
walk(i-1,j,index+1,map);
}else{//向左走
walk(i,j-1,index+1,map);
}
}
}
这样就能保证每走一步、都能保证四个走法,实现穷举,然后就要开始完善,
1、走过的就不能在走了:用到了一个数组,记录走过的位置;
2、增加条件:当所在的位置是1或者是数组里记录的已经走过的,就直接结束;当走到终点也结束。
根据思路完善后代码如下:
package com.digui;
public class MiGong2 {
private static String[] arry = new String [30];
private static String temp="";
private static int shortindex=-1;
public static void main(String[] args) {
//创建迷宫
int[][] map = createMap(7,6);
//增加墙体
map[3][1] =1;
map[3][2] =1;
map[2][4]=1;
//showMap(map);
walk(1,1,0,map);
System.out.println("迷宫最短路径为:"+shortindex);
}
/*
* 展示迷宫
*/
public static void showMap(int[][] map) {
for(int i =0;i<map.length;i++) {
for(int j=0;j<map[0].length;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
System.out.println();
}
}
/*
* @param row 迷宫行数
* @param col 迷宫列数
* return 一个row行col列迷宫,1代表迷宫的墙
*/
public static int[][] createMap(int row,int col) {
int [][] map = new int[row][col];
for(int i=0;i<row;i++) {
map[i][0]=1;
map[i][col-1]=1;
}
for(int j=0; j<col; j++) {
map[0][j]=1;
map[row-1][j]=1;
}
return map;
}
/*
* @param i 行号
* @param j 列号
* @param index 步数
* @param map 地图
*/
public static void walk(int i,int j,int index,int[][] map) {
temp=i+","+j;
if(isWalked(temp,index)) {
return;
}
arry[index]=temp;
temp="";
if(map[i][j] == 1) {
return;
}
if( i==5 && j==2) {//终点为5,2
//showSuccessPath(index);
findshort(index);
return;
}
for(int n =0;n<4;n++) {
if(n==0) {//向下走
walk(i+1,j,index+1,map);
}else if(n==1) {//向右走
walk(i,j+1,index+1,map);
}else if(n==2) {//向上走
walk(i-1,j,index+1,map);
}else{//向左走
walk(i,j-1,index+1,map);
}
}
}
/*
* @param key 下一步要走的位置
* @param index 当前已走的步数
* return -> true 前面已经走过了 -> false 前面还未走过
*/
public static boolean isWalked(String key,int index) {
for(int i=0;i<index;i++) {
if(arry[i].equals(key) || arry[i] == key) {
return true;
}
}
return false;
}
/*
*@param index 成功时走的步数
* 比较找出shortindex最小值
*/
public static void findshort(int index) {
if(index == -1) {
return;
}
else if(shortindex == -1) {
shortindex=index;
}else {
if(index<=shortindex) {
shortindex=index;
}else {
return;
}
}
}
/*
* @param index 成功时走的步数
* 能够打印出每次成功时的路径
*/
public static void showSuccessPath(int index) {
for(int i=0;i<=index;i++) {
System.out.print(arry[i]+" ");
}
System.out.println();
}
}