剑指 Offer 12. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false
这是第二次碰到这个题目了,第一次时,自己没做出来,但是这次仅仅五次调试就做出来了,所以刷力扣的同学,要坚持下去,一定会有收获。
int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs(char** board,int prex,int prey,int cux,int cuy,int po,char *word,int xmax,int ymax,int len,int *r, int **ar){
if(po==len){
*r=1;
}
if(*r!=1){
int i;
for(i=0;i<4;i++){
int x=cux+direction[i][0];
int y=cuy+direction[i][1];
if(x==prex&&y==prey){
continue;
}
if(x>=0&&x<=ymax&&y>=0&&y<=xmax&&board[x][y]==word[po]&&ar[x][y]==0){
ar[x][y]=1;
dfs(board,cux,cuy,x,y,po+1,word,xmax,ymax,len,r,ar);
ar[x][y]=0;
}
}
}
}
bool exist(char** board, int boardSize, int* boardColSize, char* word){
int xmax=boardColSize[0]-1;
int ymax=boardSize-1;
int *r=(int *)malloc(sizeof(int));
int **ar=(int **)malloc(sizeof(int*)*boardSize);
*r=0;
int len=strlen(word);
int i,j;
for(i=0;i<boardSize;i++){
ar[i]=(int *)malloc(sizeof(int)*boardColSize[0]);
}
for(i=0;i<boardSize;i++){
for(j=0;j<boardColSize[0];j++){
ar[i][j]=0;
}
}
for(i=0;i<=ymax;i++){
for(j=0;j<=xmax;j++){
if(board[i][j]==word[0]){
ar[i][j]=1;
dfs(board,-1,-1,i,j,1,word,xmax,ymax,len,r,ar);
ar[i][j]=0;
}
if(*r==1){
return true;
}
}
}
return false;
}