纯C
用一个相同规格的数组visited来标记当前结点是否已经访问,以防止走回头路。dfs用来访问某个结点,判定迭代条件和边界。直到找到一条匹配路径。代码用全局变量和一些办法取消了引用。
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix char字符型二维数组 * @param matrixRowLen int matrix数组行数 * @param matrixColLen int* matrix数组列数 * @param word string字符串 * @return bool布尔型 * * C语言声明定义全局变量请加上static,防止重复定义 */ #include <stdbool.h> bool dfs(char** matrix,int matrixRowLen,int* matrixColLen,char* word,int i,int j,char visited[][* matrixColLen]){ static int I=0,a; if(word[I]!=matrix[i][j]){//dfs迭代条件 return false; } if(word[I+1]=='\0'){//出口:已全部匹配所有字符 return true; } if(i<matrixRowLen-1 && visited[i+1][j]!='1'){//向下走 i++;I++;visited[i][j]='1';//标记已访问 a=dfs(matrix,matrixRowLen,matrixColLen,word,i,j,visited);//继续寻找下一步 if(a) return true;//满足出口条件就退出整个函数体 visited[i][j]='0';i--;I--;//不匹配就回溯到这次递归的上一步:该次if()外 } if(i>0 && visited[i-1][j]!='1'){//向上走 i--;I++;visited[i][j]='1'; a=dfs(matrix,matrixRowLen,matrixColLen,word,i,j,visited); if(a) return true; visited[i][j]='0';i++;I--; } if(j<*matrixColLen-1 && visited[i][j+1]!='1'){//向右走 j++;I++;visited[i][j]='1'; a=dfs(matrix,matrixRowLen,matrixColLen,word,i,j,visited); if(a) return true; visited[i][j]='0';j--;I--; } if(j>0 && visited[i][j-1]!='1'){//向左走 j--;I++;visited[i][j]='1'; a=dfs(matrix,matrixRowLen,matrixColLen,word,i,j,visited); if(a) return true; visited[i][j]='0';j++;I--; } return false;//出口:没有路可以走了 } bool hasPath(char** matrix, int matrixRowLen, int* matrixColLen, char* word ) { // write code here char visited[matrixRowLen][*matrixColLen]; for(int i=0;i<matrixRowLen;i++){//以每个结点为起点寻找路径 for(int j=0;j<*matrixColLen;j++){ memset(visited,'0',sizeof(visited)); visited[i][j]='1'; if(dfs(matrix,matrixRowLen,matrixColLen,word,i,j,visited)){ return true; } } } return false; }