题解 | #矩阵中的路径#
矩阵中的路径
https://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix char字符型二维数组 * @param word string字符串 * @return bool布尔型 */ Boolean isContain = false; public boolean hasPath (char[][] matrix, String word) { // write code here int xlength = matrix.length; int ylength = matrix[0].length; int[][] visit = new int[xlength][ylength]; Stack<int[]> stack = new Stack ();//stack存路径,类似BFS广搜路径close表,但stack只存当前条路径,弹出后再存别条的路径,BFS的close表存所有经过的路径 char[] wordc = word.toCharArray(); for (int i = 0; i < xlength; i++) { for (int j = 0; j < ylength; j++) { int[] xy = {i, j}; stack.push(xy); // stackc.push(wordc[0]); if (matrix[i][j] == wordc[0]) { dfs(xy, stack, wordc, 0, matrix, xlength, ylength, visit); if (isContain) { return true; } } stack.pop(); } } return false; } public void dfs( int[] xy, Stack<int[]> stack, char[] wordc, int num, char matrix[][], int xlength, int ylength, int[][] visit) { System.out.println("num:" + num); //stack 存储路径 System.out.println("w:" + wordc.length); //stack 存储路径 if (num == ( wordc.length - 1)) { isContain = true; return; } if (!stack.isEmpty()) { if (stack.size() > 0) { for (int i = -1; i < 2; i++) for (int j = -1; j < 2; j++) { if (i != j && i != -1 * j) {//满足条件的i,j组合为{-1,0},{0,-1},{1,0},{0,1},即上下左右四个方向 int posX = stack.peek()[0] + i; int posY = stack.peek()[1] + j; num = num + 1; if (posX < xlength && posX >= 0 && posY < ylength && posY >= 0) { if (matrix[posX][posY] == wordc[num] && visit[posX][posY] == 0 ) { visit[posX][posY] = 1; int[] xyadd = {posX, posY}; stack.push(xyadd); //递归之前的为本条递归的内容,直到尽头 dfs(xy, stack, wordc, num, matrix, xlength, ylength, visit); //递归之后(也是递归到达尽头后)的为下条递归设置的条件 //回溯,为另分一个分支接下来的递归设置条件,不是全部置空 stack.pop(); visit[posX][posY] = 0; } } num = num - 1; } } } } } //递归里用return的话要把return结果返回给上次递归,不然会返回值覆盖(相当于多个返回结果) }#dfs#