public class Solution {
public static void main(String[] args){
char[][] board = {{'A','B','C','E'},{'S','F','E','S'},{'A','D','E','E'}};
Solution s = new Solution();
s.exist(board, "ABCESEEEFS");
}
public boolean exist(char[][] board, String word) {
char start = word.charAt(0);
int m = board.length;
if(m==0) return false;
int n = board[0].length;
int[][] used = new int[m][n];
boolean res = false;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]==start){
boolean tmp = backtrack(board,word,start,m,n,0,i,j,used);
used[i][j] = 0;//back!
if(tmp) return true;
}
}
}
return res;
}
public boolean backtrack(char[][] board, String word,char start,int m,int n,int idx,int i,int j,int[][] flag){
flag[i][j] = 1;
if(idx==word.length()-1) return true;
idx++;
start = word.charAt(idx);
boolean res = false;
if(i-1>=0&&flag[i-1][j]!=1&&board[i-1][j]==start) {//up
boolean tmp = backtrack(board,word,start,m,n,idx,i-1,j,flag);
flag[i-1][j] = 0;
if(tmp) return true;
}
if(i+1<m&&flag[i+1][j]!=1&&board[i+1][j]==start){ //down
boolean tmp = backtrack(board,word,start,m,n,idx,i+1,j,flag);
flag[i+1][j] = 0;
if(tmp) return true;
}
if(j-1>=0&&flag[i][j-1]!=1&&board[i][j-1]==start){ //left
boolean tmp = backtrack(board,word,start,m,n,idx,i,j-1,flag);
flag[i][j-1] = 0;
if(tmp) return true;
}
if(j+1<n&&flag[i][j+1]!=1&&board[i][j+1]==start){ //right
boolean tmp = backtrack(board,word,start,m,n,idx,i,j+1,flag);
flag[i][j+1] = 0;
if(tmp) return true;
}
return res;
}
}