一、剑指 Offer 12. 矩阵中的路径
思路:遍历数组,找到word的起点字符,对该起点坐标进行回溯。回溯过程:对该坐标的上下、左右相邻坐标在满足相关条件下进行回溯,终止条件:graph的最后一个坐标的值等于world的长度。
private boolean flag = false;
public boolean exist(char[][] board, String word) {
int x = board.length;
int y = board[0].length;
int[][] graph;
char c = word.charAt(0);
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (board[i][j] == c) {
graph = new int[x][y];
graph[i][j] = 1;
backtrace(board, graph, word, i, j);
if (flag) {
return flag;
}
}
}
}
return false;
}
private void backtrace(char[][] board, int[][] graph, String word, int x, int y) {
if (graph[x][y] == word.length()) {
flag = true;
return;
}
int direction = 0;
while (direction <= 3) {
//1.下一跳不越界 2.下一跳的值等于word的值 3.下一跳的值不是走过的路径
switch (direction) {
//向上
case 0:
if (x - 1 >= 0 && graph[x - 1][y] == 0 && word.charAt(graph[x][y]) == board[x - 1][y]) {
graph[x - 1][y] = graph[x][y] + 1;
backtrace(board, graph, word, x - 1, y);
graph[x - 1][y] = 0;
}
break;
//向右
case 1:
if (y + 1 < board[0].length && graph[x][y + 1] == 0 && word.charAt(graph[x][y]) == board[x][y + 1]) {
graph[x][y + 1] = graph[x][y] + 1;
backtrace(board, graph, word, x, y + 1);
graph[x][y + 1] = 0;
}
break;
//向下
case 2:
if (x + 1 < board.length && graph[x + 1][y] == 0 && word.charAt(graph[x][y]) == board[x + 1][y]) {
graph[x + 1][y] = graph[x][y] + 1;
backtrace(board, graph, word, x + 1, y);
graph[x + 1][y] = 0;
}
break;
//向左
case 3:
if (y - 1 >= 0 && graph[x][y - 1] == 0 && word.charAt(graph[x][y]) == board[x][y - 1]) {
graph[x][y - 1] = graph[x][y] + 1;
backtrace(board, graph, word, x, y - 1);
graph[x][y - 1] = 0;
}
break;
}
direction++;
}
}
二、面试题13. 机器人的运动范围
class Solution {
boolean[][] visited;
public int movingCount(int m, int n, int k) {
visited = new boolean[m][n];
return dfs(0, 0, m, n, k);
}
private int dfs(int x, int y, int m, int n, int k) {
if (x >= m || y >= n || visited[x][y]
|| (x % 10 + x / 10 + y % 10 + y / 10) > k) {
return 0;
}
visited[x][y] = true;
return 1 + dfs(x + 1, y, m, n, k) + dfs(x, y + 1, m, n, k);
}
}