首页 > 其他 > 详细

迷宫问题

时间:2020-02-24 15:47:22      阅读:75      评论:0      收藏:0      [点我收藏+]

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入格式

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

输出格式

左上角到右下角的最短路径,格式如样例所示。

样例输入

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

样例输出

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

import java.util.*;


public class 迷宫 {
     static Position[][] maze = new Position[8][8];

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            for (int i = 0; i < 8; i++) {// 全部初始化,不然搜索的时候会报错
                for (int j = 0; j < 8; j++) {
                    maze[i][j] = new Position(i, j, 1);// 人工建墙,围上迷宫,免得判范围
                }
            }
            int[][] operate = { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 } };// 表驱动法代替连续if
            for (int i = 1; i <= 5; i++) {
                for (int j = 1; j <= 5; j++) {
                    maze[i][j].value = sc.nextInt();
                }
            }
            Queue<Position> wait = new LinkedList<Position>();
            wait.add(maze[1][1]);
            while (!wait.isEmpty()) {
                Position cur = wait.poll();
                if (cur.x == 5 && cur.y == 5)
                {
                    // 写了个递归,从终点开始回退,到达起点为止开始输出,达到题目从头输出的要求
                    outPut(5, 5);
                    break;
                }
                cur.value = 1;// 标记为走过
                for (int i = 0; i < 4; i++) {
                    int nextX = cur.x + operate[i][0];
                    int nextY = cur.y + operate[i][1];
                    if (maze[nextX][nextY].value == 0) {
                        wait.add(maze[nextX][nextY]);
                        maze[nextX][nextY].pre = cur;// 链式记录
                    }
                }
            }
        }

        public static void outPut(int x, int y) {
            if (maze[x][y].pre == null) {
                System.out.println("(0, 0)");
                return;
            }
            outPut(maze[x][y].pre.x, maze[x][y].pre.y);
            int realX = x - 1;
            int realY = y - 1;
            System.out.println("(" + realX + ", " + realY + ")");
        }
    }

    class Position {
        int x;
        int y;
        int value;
        Position pre;

        public Position(int x, int y, int value) {
            this.x = x;
            this.y = y;
            this.value = value;
        }

}

 

迷宫问题

原文:https://www.cnblogs.com/shiaguang/p/12357191.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!