思路:回溯算法
关键点,在于回溯,如果你想往下找的话,必须用状态改变和状态恢复来包裹向下找的过程。
你现在所在的寻找是某些寻找的分支,当你江郎才尽之时,需将状态完全恢复。
class Solution_12 {
private boolean[][] flag;
private char[][] board;
private String word;
private int total;//记录总的序号值
public boolean exist(char[][] board, String word) {
this.word = word;
this.board = board;
total = word.length() - 1;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
flag = new boolean[board.length][board[0].length];
if (search(i, j, 0)) {
return true;
}
}
}
return false;
}
// 这个方法能够判断,以x,y为开始位置,从第n个字母开始,有没有路径
public boolean search(int x, int y, int n) {
// 超范围,返回false
if (x < 0 || x >= flag.length || y < 0 || y >= flag[0].length) return false;
// 不等 或者 访问过 的话,直接返回false
if (flag[x][y] || board[x][y] != word.charAt(n)) return false;
// 比对到最后一个字母,必须要输出
if (n == total) {
return true;
}
// 没有比对到最后一个字母
flag[x][y] = true;
boolean mark = (search(x + 1, y, n + 1) || search(x - 1, y, n + 1)
|| search(x, y + 1, n + 1) || search(x, y - 1, n + 1));
flag[x][y] = false;
return mark;
}
}