package com.cai.learn.math; /** * 迷宫回溯: * 目标:用递归方法达到指定位置 */ public class MazeQuestion { public static void main(String[] args) { //搭建简单的迷宫 int[][] maze = new int[8][7]; //搭建四周 以数字1 表示挡板 //左右两竖排 for (int i = 0; i < 8; i++) { maze[i][0] = 1; maze[i][6] = 1; } //上下两横排 for (int i = 0; i < 7; i++) { maze[0][i] = 1; maze[7][i] = 1; } //中间设置2个挡格 maze[3][1] maze[3][2] maze[3][1] =1; maze[3][2] =1; /*基本形成: 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 */ //目标:从maze[1][1] --->maze[6][5] setWay(maze,1,1); for (int i = 0; i < 8; i++) { for (int j = 0; j <7 ; j++) { System.out.print(maze[i][j]+" "); } System.out.println(); } /*基本实现 2是所走的路线 1 1 1 1 1 1 1 1 2 0 0 0 0 1 1 2 2 2 0 0 1 1 1 1 2 0 0 1 1 0 0 2 0 0 1 1 0 0 2 0 0 1 1 0 0 2 2 2 1 1 1 1 1 1 1 1 */ } /** * 说明: * 1.maze表示地图 * 2.i,j表示开始位置(1.1) * 3.如果能移动到位置(7.5),则说明找到 * 4.约定:0.表示没有走过的路,1表示此路不通,2表示通路可以走,3.表示已经走过但此路不通 * 5.在走迷宫时,需要一个策略(方法) 下->右->上->左,若果走不通,再回溯 * * @param maze 模拟地图数组 * @param i 横坐标 * @param j 纵坐标 * @return */ public static boolean setWay(int[][] maze,int i,int j){ if(maze[6][5]==2){ return true; }else{ if(maze[i][j]==0){//表示未走过 //下->右->上->左 maze[i][j] = 2; if(setWay(maze,i+1,j)){ return true; }else if(setWay(maze,i,j+1)){ return true; }else if(setWay(maze,i-1,j)){ return true; }else if(setWay(maze,i,j-1)){ return true; }else{ maze[i][j] = 3; return false; } }else{ return false; } } } }