import java.util.*; /**  * Created by wxn  * 2019/9/3 19:02  * <p>  * 题目描述:  * 假设以一个n*m的矩阵作为棋盘,每个棋位对应一个二维坐标 (x, y)。你有一颗棋子位于左上起点(0, 0),现在需要将其移动到右下底角 (n-1, m-1),棋子可以向相邻的上下左右位置移动,每个坐标最多只能经过一次。棋盘中散布着若干障碍,障碍物不能跨越,只能绕行,问是否存在到达右下底角的路线?若存在路线,输出所需的最少移动次数;若不存在,输出0。 Input 第一行三个正整数n,m和k,代表棋盘大小与障碍物个数  1< n、m < 100,  k < n*m 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。  * <p>  * 输入  * 输入三个正整数n,m和k,代表棋盘大小与障碍物个数  1< n、m < 100,  k < n*m  * <p>  * 第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。  * <p>  * 输出  * 输出从起点到终点的最短路径的长度,如果不存在,即输出0  */ public class Main { static int[][] d = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} }; static int startX = 0; static int startY = 0; static int endX = 0; static int endY = 0; static Set<Integer> stepList = new HashSet<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); //棋盘,障碍物为1,否则为0 /**  * 5  * .#...  * ..#S.  * .E###  * .....  * .....  */ char[][] board = new char[n][n]; 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; } } } shortestLength(board, n); if (stepList.size() == 0) { System.out.println(-1); return; } int minStep = Integer.MAX_VALUE; for (Integer integer : stepList) { if (integer < minStep) { minStep = integer; } } System.out.println(minStep); } private static void shortestLength(char[][] board, int n) { boolean[][] visited = new boolean[n][n]; visited[startX][startY] = true; shortestLength(board, n, startX, startY, 0, visited); } private static void shortestLength(char[][] board, int n, int startX, int startY, int step, boolean[][] visited) { if (startX == endX && startY == endY) { stepList.add(step); return; } for (int i = 0; i < 4; i++) { int newX = startX + d[i][0]; int newY = startY + d[i][1]; if (newX < 0) { newX = n - 1; } else if (newX==n) { newX = 0; } if (newY <0) { newY = n-1; }else if (newY==n){ newY = 0; } if (board[newX][newY] !='#' && !visited[newX][newY]) { visited[newX][newY] = true; shortestLength(board, n, newX, newY, step + 1, visited); visited[newX][newY] = false; } } } }
点赞 2

相关推荐

牛客网
牛客企业服务