刷题记录-小红书-2020-迷宫游戏

题目:

薯队长最近在玩一个迷宫探索类游戏,迷宫是一个N*N的矩阵形状,其中会有一些障碍物禁止通过。这个迷宫还有一个特殊的设计,它的左右 边界以及上下边界是连通的,比如在(2,n)的位置继续往右走一格可以到(2,1),    在(1,2)的位置继续往上走一格可以到(n,2)。请问薯队长从起点位置S,最少走多少格才能到达迷宫的出口位置E。

第一行正整数N,接下来N行字符串
’.’表示可以通过
’#’表示障碍物
’S’表示起点(有且仅有一个)
’E’表示出口(有且仅有一个)
对于50%的数据N<10
对于100%的数据N<10^3 

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

示例-1
输入:
5
.#...
..#S.
.E### 
..... 
.....

输出:
4

 

思路:

1. 使用BFS,已S点作为开始点,且当且步数为0,使用队列存储可到达点信息;

2. 每次弹出队列头结点,并对上下左右进行判断,若可移动加入队列;

3. 当某次运行到E时,输出当前步数。

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        
        // get and process the input
        Scanner scanner = new Scanner(System.in);
        int num = Integer.valueOf(scanner.nextLine());
        char[][] migong = new char[num][num];
        int startX = 0;
        int startY = 0;
        int endX = 0;
        int endY = 0;
        for(int i=0;i) {
            String tempString = scanner.nextLine();
            if(tempString.contains("S")) {
                startX = i;
                startY = tempString.indexOf("S");
            }
            if(tempString.contains("E")) {
                endX = i;
                endY = tempString.indexOf("E");
            }
            for(int j=0;j<5;j++) {
                
                migong[i] = tempString.toCharArray();
            }
        }
        

        // start
        Queue queue = new LinkedList();
        queue.offer(startX+"@@"+startY+"@@"+0);
        ArrayList iArrayList = new ArrayList();
        int stamp = Integer.MAX_VALUE;
        while (!queue.isEmpty()) {
            String temp = queue.poll();
            int tempX = Integer.valueOf(temp.split("@@")[0]);
            int tempY = Integer.valueOf(temp.split("@@")[1]);
            int tempstamp = Integer.valueOf(temp.split("@@")[2]);
            
            if(tempX == endX && tempY == endY) {
                stamp = Math.min(stamp, tempstamp);
                break;
            }
            
            
            // move up
            if(tempX == 0) {
                
                if(migong[num-1][tempY] != '#') {
                    if(!iArrayList.contains((num-1)+"@@"+tempY)) {
                        queue.offer((num-1)+"@@"+tempY+"@@"+(tempstamp+1));
                        iArrayList.add((num-1)+"@@"+tempY);
                    }
                    
                }
                
            }else {
                
                if(migong[tempX-1][tempY] != '#') {
                    if(!iArrayList.contains((tempX-1)+"@@"+tempY)) {
                        queue.offer((tempX-1)+"@@"+tempY+"@@"+(tempstamp+1));
                        iArrayList.add((tempX-1)+"@@"+tempY);
                    }
                    
                }
            }
            
            // move down
            if(tempX == num-1) {
                
                if(migong[0][tempY] != '#') {
                    if(!iArrayList.contains(0+"@@"+tempY)) {
                        queue.offer(0+"@@"+tempY+"@@"+(tempstamp+1));
                        iArrayList.add(0+"@@"+tempY);
                    }
                    
                }
                
            }else {
                
                if(migong[tempX+1][tempY] != '#') {
                    if(!iArrayList.contains(tempX+1+"@@"+tempY)) {
                        queue.offer(tempX+1+"@@"+tempY+"@@"+(tempstamp+1));
                        iArrayList.add(tempX+1+"@@"+tempY);
                    }
                    
                }
            }
            
            // move left
            if(tempY == 0) {
                
                if(migong[tempX][num-1] != '#') {
                    if(!iArrayList.contains(tempX+"@@"+(num-1))) {
                        queue.offer(tempX+"@@"+(num-1)+"@@"+(tempstamp+1));
                        iArrayList.add(tempX+"@@"+(num-1));
                    }
                    
                }
                
            }else {
                
                if(migong[tempX][tempY-1] != '#') {
                    if(!iArrayList.contains(tempX+"@@"+(tempY-1))) {
                        queue.offer(tempX+"@@"+(tempY-1)+"@@"+(tempstamp+1));
                        iArrayList.add(tempX+"@@"+(tempY-1));
                    }
                    
                }
            }
            
            // move right
            if(tempY == num-1) {
                
                if(migong[tempX][0] != '#') {
                    if(!iArrayList.contains(tempX+"@@"+0)) {
                        queue.offer(tempX+"@@"+0+"@@"+(tempstamp+1));
                        iArrayList.add(tempX+"@@"+0);
                    }
                    
                }
                
            }else  {
                
                if(migong[tempX][tempY+1] != '#') {
                    if(!iArrayList.contains(tempX+"@@"+(tempY+1))) {
                        queue.offer(tempX+"@@"+(tempY+1)+"@@"+(tempstamp+1));
                        iArrayList.add(tempX+"@@"+(tempY+1));
                    }
                    
                }
            }
            
        }
        
        if(stamp == Integer.MAX_VALUE) System.out.println(-1);
        else System.out.println(stamp);

    }

}

 

AC 70% , 超时

你可能感兴趣的:(刷题记录-小红书-2020-迷宫游戏)