迷宮問題(java實現)

一、java

public class Direction {
    private int x;
    private int y;
    public Direction(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

二、this

public class Position {
    private int x;
    private int y;
    private int d;
    public int getX() {
        return this.x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return this.y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Position(int x, int y, int d) {
        this.x = x;
        this.y = y;
        this.d = d;
    }
    public int getD() {
        return this.d;
    }
    public void setD(int d) {
        this.d = d;
    }
}

三、spa

import java.util.Iterator;
import java.util.Stack;
public class MazeProblem {
    public static Stack<Position> path(int[][] maze, Direction[] move) {
        Stack<Position> s = new Stack<Position>();
        // 起點位置 還未開始探索因此無方向
        Position start_p = new Position(1, 1, -1);
        s.push(start_p);
        maze[1][1] = -1; // 起點位置表示已經走過,不能夠往回探索,pop的時候 能夠退回
        while (!s.empty()) {
            Position temp = s.pop(); // 取出當前的位置 準備進行向下探索
            // 肯定探索的位置方向
            int x = temp.getX(); // 當前處在正在探索的位置和方向
            int y = temp.getY();
            int d = temp.getD() + 1;// 探索的方向
            while (d < 8) { // 開始探索 一共八個方向
                int i = x + move[d].getX(); // 根據某個方向探的下一個位置
                int j = y + move[d].getY();
                if (maze[i][j] == 0) { // 若是下一個位置是能夠進去的,則放入當前位置
                    s.push(new Position(x, y, d));
                    x = i; // 把當前探索位置 調整爲放入的位置
                    y = j;
                    d = 0; // 調整方向爲0,爲下次探索作準備
                    maze[x][y] = -1; // 而後設置爲已走過
                    if (x == Destination.m && y == Destination.n) { // 在判斷是否是已是終點位置 若是是 則程序退出
                        s.push(new Position(x, y, d));
                        return s;
                    }
                } else {
                    d++;  //// 若是下一個位置是不能夠進去的,則放入調整方向
                }
            }
        }
        return new Stack<Position>();
    }
    //終點位置
    static class Destination {
        static int m = 6;
        static int n = 8;
    }
    public static void main(String[] arg) {
        // 0表示可進入 1 表示 不能夠進去 -1 表示走過的路勁也不可進入
        // 每一個位置 都有八個方向
        int[][] maze = {
            //    0  1  2  3  4  5  6  7  8  9
                { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 0
                { 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, // 1
                { 1, 1, 0, 1, 0, 1, 1, 1, 1, 1 }, // 2
                { 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, // 3
                { 1, 0, 1, 1, 1, 1, 1, 0, 1, 1 }, // 4
                { 1, 1, 0, 0, 1, 1, 1, 1, 0, 1 }, // 5
                { 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 }, // 6
                { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }  // 7
        };
        Direction[] move = 
        {
            new Direction(0,  1),
            new Direction(1,  1), 
            new Direction(1,  0),
            new Direction(1, -1),
            new Direction(0, -1),
            new Direction(-1,-1), 
            new Direction(-1, 0),
            new Direction(-1, 1)
        };
        Stack<Position> s = MazeProblem.path(maze, move);
        Iterator<Position> it = s.iterator();
        while (it.hasNext()) {
            Position e = it.next();
            System.out.println(e.getX() + ",-->" + e.getY());
        }
    }
}
相關文章
相關標籤/搜索