回溯注意点
// 这种结点不能重复使用的,必须用标记数组或者修改数组值为‘#’, 深搜失败,向上回溯的时候还要撤销影响,
// 所有dfs()函数的返回值必须为 void , 不能为 boolean。 因为返回值不是void的情况下,深搜失败结束就立即return了, 没有机会撤销影响
题目
代码及注释
class Solution {
boolean[][] visit ;
boolean find; // 这种结点不能重复使用的,必须用标记数组或者修改数组值为‘#’, 深搜失败,向上回溯的时候还要撤销影响,
// 所有dfs()函数的返回值必须为 void , 不能为 boolean。 因为返回值不是void的情况下,深搜失败结束就立即return了, 没有机会撤销影响
public boolean exist(char[][] board, String word) {
if(word.length() > board.length * board[0].length){
return false;
}
visit = new boolean[board.length][board[0].length];
for(int i =0; i<board.length; i++){ // 在主函数里面实现不同起点
for(int j=0; j<board[0].length;j++){
dfs(board,word,i,j,0);
}
}
return find;
}
public void dfs(char[][] board, String word,int x,int y, int pos){
if(pos == word.length()){
find = true; // 只有检索成功了才会修改 find值, 其余情况只是单纯的return
return ;
}
if( x >= board.length || x < 0 || y >= board[0].length || y < 0){
return ;
}
if( ! visit[x][y] && word.charAt(pos) == board[x][y] ){
visit[x][y] =true;
dfs(board,word, x+1, y, pos+1 );
dfs(board,word, x, y+1, pos+1);
dfs(board,word, x-1, y, pos+1);
dfs(board,word, x, y-1, pos+1);
visit[x][y] =false;
}
return ;
}
}
// @solution-sync:end
class Main {
public static void main(String[] args) {
char[][] board = new char[][]{
new char[]{'A', 'B', 'C', 'E'},
new char[]{'S', 'F', 'C', 'S'},
new char[]{'A', 'D', 'E', 'E'}
};
String word = "ABCCED";
boolean result = new Solution().exist(board, word);
System.out.println(result);
}
}