/* 79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<iostream> #define DIR 4 int direction[DIR][2]={{1,0},{-1,0},{0,1},{0,-1}}; int dfs(char** board, int m, int n, int i,int j,char * word,int depth,int** visited){ if(depth==strlen(word)) return 1; if(i<0||i>=m||j<0||j>=n) return 0; if(visited[i][j]||board[i][j]!=word[depth]) return 0; visited[i][j]=1; for(int k=0;k<DIR;k++){ int new_x = i + direction[k][0]; int new_y = j + direction[k][1]; if(dfs(board,m,n,new_x,new_y,word,depth+1,visited)) return 1; } visited[i][j]=0; return 0; } bool exist(char** board, int boardSize, int* boardColSize, char * word){ int m=boardSize,n=*boardColSize,i,j; int** visited=(int**)calloc(sizeof(int*),m); for(i=0;i<m;i++){ visited[i]=(int*)calloc(sizeof(int),n); } for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(dfs(board,m,n,i,j,word,0,visited)){ printf("1 "); return 1; } } } return 0; } int main() { char **board=(char**)malloc(sizeof(char*)*100),str[3][4]={{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}}; int i,boardSize=3,*boardColSize=(int*)malloc(sizeof(int)); *boardColSize=4; char word[6]={'A','B','C','C','E','D'}; for(i=0;i<boardSize;i++){ board[i]=str[i]; } bool rs = exist(board,boardSize,boardColSize,word); printf("%d ",rs); return 0; }