注意点:题目中要求同一个单元格内的字母不允许被重复使用,实现方法如下:
定义一个boolean型的数组,每走到一个位置,该数组就置1,如果下面的路不通出现回溯,再置零
完整代码:
public class code79 {
int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
String word;
char[][] board;
int m;
int n;
boolean marked[][];
public boolean exist(char[][] board, String word) {
this.m = board.length;
this.n = board[0].length;
this.word = word;
this.board = board;
this.marked = new boolean[m][n];
if (m == 0)
return false;
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
if(dfs(i,j,0))
return true;
}
}
return false;
}
private boolean dfs(int i, int j, int start) {
if(start == word.length()-1)
return board[i][j] == word.charAt(start);
if(board[i][j] == word.charAt(start)){
marked[i][j] = true;//同一个单元格内的字母不允许被重复使用
for (int[] dir: dirs) {
int x = dir[0];
int y = dir[1];
if(inArea(i+x,j+y) && !marked[i+x][j+y]){
if(dfs(i+x,j+y,start+1))
return true;
}
}
marked[i][j] = false;//回溯时状态置零
}
return false;
}
private boolean inArea(int x,int y){
return x>=0&&x<m&&y>=0&&y<n;
}
}