题解 | #迷宫问题#

迷宫问题

http://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc

每个位置进行前后左右试探前进,如果没超过临界值就入队列。因为队列的先进先出特性,所以会扩散着搜索 通过自定义Node类将到达终点的每个点串起来,顺序反转之后打印

//广度优先遍历
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        Queue<Node> que = new LinkedList<>();
        Node head = new Node(0,0,null);
        int row = sc.nextInt();
        int col = sc.nextInt();
        int[][] nums = new int[row][col];
        for(int i = 0;i < row;i++){
            for(int j = 0;j < col;j++){
                nums[i][j] = sc.nextInt();
            }
        }
        que.add(head);
        while(!que.isEmpty()){
            //获取当前路径
            Node cur = que.poll();
            //记录当前路径坐标
            int i = cur.row;
            int j = cur.col;
            if(nums[i][j] == 1)
                continue;
            //标记当前路径
            nums[i][j] = 1;
            //判断是否走到终点
            if(i + 1 == row && j + 1 == col){
                reverseAndDisplay(cur);
                break;
            }
            //判断右边是否有路,有则入队列
            if(j < col - 1 && nums[i][j+1] != 1)
                //让当前路径与下一个路径相连接
                que.add(new Node(i,j+1,cur));
            //判断下边是否有路,有则入队列
            if(i < row - 1 && nums[i+1][j] != 1)
                que.add(new Node(i+1,j,cur));
            //判断左边
            if(j > 0 && nums[i][j-1] != 1)
                que.add(new Node(i,j-1,cur));
            //上
            if(i > 0 && nums[i-1][j] != 1)
                que.add(new Node(i-1,j,cur));
        }
    }
    private static void reverseAndDisplay(Node last){
        Node cur = last;
        while(cur.prev != null){
            cur.prev.next = cur;
            cur = cur.prev;
        }
        display(cur);
    }
    private static void display(Node head){
        Node cur = head;
        while(cur != null){
            cur.print();
            cur = cur.next;
        }
    }
    private static class Node{
        private final int row;
        private final int col;
        private Node next;
        private Node prev;
        public Node(int row,int col,Node prev){
            this.row = row;
            this.col = col;
            this.prev = prev;
        }
        private void print(){
            System.out.println("(" + row + "," + col + ")");
        }
    }
}
全部评论

相关推荐

03-09 13:40
上海大学 Java
点赞 评论 收藏
分享
03-10 20:35
已编辑
武汉大学 C++
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务