转载

小红书2020笔试题-迷宫游戏

小红书2020笔试题

迷宫游戏

薯队长最近在玩一个迷宫探索类游戏,迷宫是一个 N ? N N*N 的矩阵形状,其中会有一些障碍物,禁止通过。

这个迷宫还有一个特殊的设计,它的左右边界以及上下边界是连通的,比如在 ( 2 , n ) (2,n) 的位置继续往右走一格

可以到 ( 2 , 1 ) (2,1) ,在 ( 1 , 2 ) (1,2) 的位置继续往上走一格可以到 ( n , 2 ) (n,2) 。请问薯队长从起点位置S,最少走多少格才能到

迷宫的出口位置E.

输入

第一行正整数N.接下来N行字符串。
‘.'表示可以通过,’#‘表示障碍物,’S'表示起点(有且仅有一个),‘E'表示终点(有且仅有一个)

输出

输出一个整数,表示从S到E最短路径长度,无法到达则输出-1

样例输入

5
.#...
..#S.
.E###
.....
.....

样例输出

4

思路

开始用DFS做,明显超时, 使用BFS, 一遍AC, 样例中可能出现没有出口的情况

java AC代码

import java.util.Scanner;
import java.io.File;
import java.util.Queue;
import java.util.LinkedList;

class Node{
    public int x;
    public int y;
    public int layer;
    public Node(int x, int y, int layer) {
        this.x = x;
        this.y = y;
        this.layer = layer;
    }
}
public class Main {
    public static void main(String[] args) throws Exception{
        //File file = new File("in.txt");
        //Scanner in = new Scanner(file);
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        char[][] board = new char[n][n];
        int startX = -1; int startY = -1; 
        int endX = -1; int endY = -1;
        for (int i = 0; i < n; i++) {
            String line = in.nextLine();
            for (int j = 0; j < n; j++) {
                board[i][j] = line.charAt(j);
                if (board[i][j] == 'S') {
                    startX = i;
                    startY = j;
                } else if (board[i][j] == 'E') {
                    endX = i;
                    endY = j;
                }
            }
        }
        in.close();
        if(startX == -1 && startY == -1) System.out.println("-1");
        if(endX == -1 && endY == -1) System.out.println("-1");
        
        Queue<Node> queue = new LinkedList<Node>();
        int x = -1; int y = -1;
        queue.offer(new Node(startX, startY, 0));
        while(!queue.isEmpty()) {
            Node node = queue.poll();
            
            //找到最后结果
            if (node.x == endX && node.y == endY) {
                System.out.println(node.layer);
                return;
            }

            //四个方向
            x = node.x + 1; y = node.y;
            if(x == n) x = 0;
            if(board[x][y] != '#') {queue.offer(new Node(x, y, node.layer + 1)); board[x][y] = '#';}

            x = node.x - 1; y = node.y;
            if(x == -1) x = n-1;
            if(board[x][y] != '#') {queue.offer(new Node(x, y, node.layer + 1)); board[x][y] = '#';}

            x = node.x; y = node.y + 1;
            if(y == n) y = 0;
            if(board[x][y] != '#') {queue.offer(new Node(x, y, node.layer + 1)); board[x][y] = '#';}

            x = node.x; y = node.y - 1;
            if(y == -1) y = n-1;
            if(board[x][y] != '#') {queue.offer(new Node(x, y, node.layer + 1)); board[x][y] = '#';}
        }
        System.out.println("-1");
    }
}
正文到此结束
本文目录