刷题记录-小红书-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<num;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<String> queue = new LinkedList<String>(); queue.offer(startX+"@@"+startY+"@@"+0); ArrayList<String> iArrayList = new ArrayList<String>(); 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% , 超时

浙公网安备 33010602011771号