JAVA枚举法-用最笨的方法解决迷宫最短路线的问题。

简单熟悉一下迷宫问题的规则:
在这里插入图片描述

如图为一个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();
	}
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值