1. 程式人生 > 實用技巧 >迷宮回溯分析及簡單實現

迷宮回溯分析及簡單實現

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; } } } }