import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * HJ43 迷宫问题 * @author d3y1 */ public class Main { public static void main(String[] args) { // solution1(); // solution2(); solution3(); } private static int[] dX = new int[]{0, 0, 1, -1}; private static int[] dY = new int[]{1, -1, 0, 0}; private static int row; private static int col; private static int[][] matrix; private static boolean[][] visited; private static Step[][] pre; private static Queue<Step> stepsQueue = new LinkedList<>(); /** * dfs */ private static void solution1(){ Scanner in = new Scanner(System.in); row = in.nextInt(); col = in.nextInt(); matrix = new int[row][col]; visited = new boolean[row][col]; pre = new Step[row][col]; for(int i=0; i<row; i++){ for(int j=0; j<col; j++){ matrix[i][j] = in.nextInt(); } } Step start = new Step(0, 0); dfs(start); printPath(row-1, col-1); } private static void dfs(Step curr){ if(curr.x==row-1 && curr.y==col-1){ return; } visited[curr.x][curr.y] = true; for(int i=0; i<4; i++){ Step next = new Step(curr.x+dX[i], curr.y+dY[i]); if(canGo(next)){ pre[next.x][next.y] = curr; dfs(next); } } visited[curr.x][curr.y] = false; } /** * bfs */ private static void solution2(){ Scanner in = new Scanner(System.in); row = in.nextInt(); col = in.nextInt(); matrix = new int[row][col]; visited = new boolean[row][col]; pre = new Step[row][col]; for(int i=0; i<row; i++){ for(int j=0; j<col; j++){ matrix[i][j] = in.nextInt(); } } Step start = new Step(0, 0); stepsQueue.add(start); bfs(); printPath(row-1, col-1); } private static void bfs(){ while (stepsQueue.size()!=0){ Step curr = stepsQueue.poll(); if(curr.x==row-1 && curr.y==col-1){ break; } for(int i=0; i<4; i++){ Step next = new Step(curr.x+dX[i], curr.y+dY[i]); if(canGo(next)){ stepsQueue.add(next); pre[next.x][next.y] = curr; } } visited[curr.x][curr.y] = true; } } private static boolean canGo(Step next){ // 越界 if(next.x<0 || next.y<0 || next.x>=row || next.y>=col){ return false; } // 墙壁 if(matrix[next.x][next.y] == 1){ return false; } // 已访问 if(visited[next.x][next.y]){ return false; } return true; } /** * 打印路径 * @param x * @param y */ private static void printPath(int x, int y){ if(x==0 && y==0){ System.out.println("("+x+","+y+")"); return; } Step previous = pre[x][y]; printPath(previous.x, previous.y); System.out.println("("+x+","+y+")"); } private static class Step { int x; int y; private Step(int x, int y){ this.x = x; this.y = y; } } ///////////////////////////////////////////////////////////////////////////////////// private static int n,m; private static boolean[][] isVisited; private static int[] dx = new int[]{-1, 1, 0, 0}; private static int[] dy = new int[]{0, 0, -1, 1}; /** * bfs */ private static void solution3(){ Scanner in = new Scanner(System.in); n = in.nextInt(); m = in.nextInt(); isVisited = new boolean[n][m]; int[][] maze = new int[n][m]; for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ maze[i][j] = in.nextInt(); } } Queue<Node> queue = new LinkedList<>(); queue.offer(new Node(0, 0)); isVisited[0][0] = true; int size; Node node,path=null; int nextRow,nextCol; boolean found = false; while(!queue.isEmpty()){ if(found){ break; } size = queue.size(); while(size-- > 0){ node = queue.poll(); if(node.row==n-1 && node.col==m-1){ found = true; path = node; } if(found){ break; } for(int i=0; i<4; i++){ nextRow = node.row+dx[i]; nextCol = node.col+dy[i]; if(isValid(nextRow, nextCol) && !isVisited[nextRow][nextCol]){ isVisited[nextRow][nextCol] = true; if(maze[nextRow][nextCol] == 0){ queue.offer(new Node(nextRow, nextCol, node)); } } } } } StringBuilder sb = new StringBuilder(); while(path != null){ sb.insert(0, "("+path.row+","+path.col+")"+"\n"); path = path.pre; } System.out.println(sb); } private static boolean isValid(int row, int col){ if(0<=row&&row<n && 0<=col&&col<m){ return true; } return false; } private static class Node { int row; int col; public Node(int row, int col){ this.row = row; this.col = col; } public Node(int row, int col, Node pre){ this.row = row; this.col = col; this.pre = pre; } Node pre = null; } }