题目描述:
代码如下:
class Solution {
public boolean exist(char[][] board, String word) {
//只有四个方向 建立方向数组
int x[]=new int[]{0,0,-1,1};//横向
int y[]=new int[]{-1,1,0,0};//纵向
//分别对应 上 下 左 右
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
//dfs
if(dfs(board, word, i, j, x, y, 0)){
return true;
}
}
}
return false;
}
boolean dfs(char[][]board,String word,int i,int j,int x[],int y[],int k){
//x y 代表棋盘的位置 k代表word中字符的位置
if(i>=board.length||i<0||j>=board[0].length||j<0||word.charAt(k)!=board[i][j]){
return false;
}
if(k==word.length()-1){
return true;
}
for (int l = 0; l < 4; l++) {
if(board[i][j]=='*'){
continue;
}
//做选择
char temp=board[i][j];
board[i][j]='*';
if (dfs(board, word, i+y[l],j+x[l],x,y,k+1)){
return true;
}
//撤销选择
board[i][j]=temp;
}
return false;
}
}
总结一下回溯算法:
... backtrack(...){
//终止条件
for 选择:选择列表 (本题中就是上下左右这四种方向的选择){
//筛选不合格的选择 (本题中就是不能重复去走已经走过的路)
//做出选择
//backtrack(...) 进行下一次决策
//撤销选择
}
}