迷宮回溯分析及簡單實現
阿新 • • 發佈:2020-09-19
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]+"\t"); } 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; } } } }