# 剑指offer（java版）面试题12：矩阵中的路径

## 题目描述

1.首先遍历矩阵，找到第一个字符的下标x,y

2.递归调用hasNextPath

3.hasNextPath 有两个功能，一是检测当前坐标x、y下的值str的值是否对应相等，如果不等，返回；二是查找下一个位置的值

public class Solution {

public static void main(String[] args) {

}

public static boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
char[][] paths = new char[rows][cols];
int index = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
paths[i][j] = matrix[index++];
}
}

for (int i = 0; i < paths.length; i++) {
for (int j = 0; j < paths[0].length; j++) {
if (paths[i][j] == str[0]) {
boolean[][] results = new boolean[rows][cols];
if (hasNextPath(results, paths, i, j, str, 0)) {
System.out.println("i  :" + i + "  j: " + j);
return true;
}
}
}
}
return false;
}

public static boolean hasNextPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) {
if (start >= str.length) {
return true;
}

if (!checkPath(path, matrix, x, y, str, start)) {
return false;
}

path[x][y] = true;
boolean result = hasNextPath(path, matrix, x - 1, y, str, start + 1) |
hasNextPath(path, matrix, x + 1, y, str, start + 1) |
hasNextPath(path, matrix, x, y - 1, str, start + 1) |
hasNextPath(path, matrix, x, y + 1, str, start + 1);
if (result) {
return true;
}

path[x][y] = false;
return false;
}

private static boolean checkPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) {
if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length || path[x][y] || matrix[x][y] != str[start]) {
return false;
}
System.out.println("check succes " + matrix[x][y]);
return true;
}
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120