C语言 矩阵中的路径
解题思路
一道典型的DFS深度优先算法的回溯问题。对于一个矩阵,首先应该遍历所有的节点,尝试把每一个节点当作入口点,代入到DFS算法,计算DFS(matrix,word,i,j,0);
DFS深度优先算法
dfs(matrix,word,i,j,index)
正确口条件:index=strlen(word),错误出口条件: i,j超出矩阵边界,或者当前word[index]!=matrix[i][j];如果满足条件,则将matrix[i][j]置为v,表示已经visit过该节点,之后不能再经过该节点,然后继续调用dfs(matrix,word,[上下左右四个点],index+1),之后将visit的点还原为原值即可。
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param matrixRowLen int matrix数组行数
* @param matrixColLen int* matrix数组列数
* @param word string字符串
* @return bool布尔型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
static int row=0;//记录矩阵行数
static int col=0;//记录矩阵列数
static int len=0;//记录字符串长度
/*
* @brief 深度优先搜索算法
* @param matrix 矩阵
* @param word 字符串
* @param i ,j 矩阵起始坐标
* @param index 字符串起始位置
*/
int dfs(char **matrix,char *word,int i,int j,int index){
int len=strlen(word);
if(index==len)
return 1;
//边界条件判断 超出矩阵范围 或者单词和矩阵字符不一致
if(i>=row||i<0||j>=col||j<0||matrix[i][j]!=word[index])
return 0;
//这一步 标记矩阵 说明已经visit
char temp=matrix[i][j];
matrix[i][j]='.';
//上下左右遍历下一个字符
int res=dfs(matrix,word,i+1,j,index+1)||dfs(matrix,word,i-1,j,index+1)||
dfs(matrix,word,i,j+1,index+1)||dfs(matrix,word,i,j-1,index+1);
matrix[i][j]=temp;
return res;
}
int hasPath(char** matrix, int matrixRowLen, int* matrixColLen, char* word ) {
// write code here
//先进行特殊情况判断 字符串为空
if(word==NULL)
return 1;
//矩阵为空
if(matrixRowLen==0||*matrixColLen==0)
return 0;
len=strlen(word);
col=* matrixColLen;
row=matrixRowLen;
//先寻找入口点
for(int i=0;i<row;i++){
//遍历矩阵列
for(int j=0;j<col;j++){
if(dfs(matrix,word,i,j,0))
return 1;
}
}
return 0;
}