题目
请设计一个函数,用来推断在一个矩阵中是否存在一条包括某字符串全部字符的路径。路径能够从矩阵中随意一格開始。每一步能够在矩阵中间向左、右、上、下移动一格。假设一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
如下
比如在以下的3*4的矩阵中包括一条字符串”bcced”的路径。
但矩阵中不包括字符串“abcb”的路径,因为字符串的第一个字符b占领了矩阵中的第一行第二格子之后,路径不能再次进入这个格子。
a b c e
s f c s
a d e e
思路
本来思路很简单,递归深度优先遍历搜索,然而在递归结束判定的时候把条件先后位置写错了两次,在发现这两此bug之前死活都调不出来,然后去github上下载了源码还把源码敲了一遍,突然再次看自己写的代码就发现了问题所在…
浪费了很多时间,十分的蛋疼…
错误代码和调整后的代码总结如下:,,,
#include<stdio.h>
#include<string.h>
//总结: 递归一定注意递归结束条件的先后顺序!!!!
bool CheckOutPath(const char matrix[][4],int rows,int cols, int pos_r,int pos_c, const char* msg,bool visitedPoint[][4])
{
// 错误 这里如果 没判断该点是否走过就reutrn baa 通过
//if(*msg == '\0')
//{
//printf(" find a path\n");
//return true;
//}
//bool hasPath = false;
if(pos_r == rows || pos_c ==cols || pos_r < 0 || pos_c < 0)
{
return false;
}
if(visitedPoint[pos_r][pos_c] == true)
return false;
visitedPoint[pos_r][pos_c] = true;
if(*msg == '\0')
{
printf(" find a path\n");
return true;
}
if(matrix[pos_r][pos_c] != *msg)
{
return false;
}
// 犯错, 如果此时msg 等于 0,会先判断上面那个if return false
//if(*msg == '\0')
//{
//printf(" find a path\n");
//return true;
//}
if( CheckOutPath(matrix,rows,cols,pos_r + 1,pos_c,msg + 1,visitedPoint) || CheckOutPath(matrix,rows,cols,pos_r ,pos_c + 1,msg + 1,visitedPoint) ||
CheckOutPath(matrix,rows,cols,pos_r - 1,pos_c,msg + 1,visitedPoint) || CheckOutPath(matrix,rows,cols,pos_r - 1,pos_c,msg - 1,visitedPoint))
//只要一个方向 true 回溯过程都会return true
return true;
return false;
}
//原来的代码
bool hasPathCore(const char matrix[][4],int rows,int cols, int row,int col, const char* msg,int& length,bool visitedPoint[][4])
{
if(msg[length] == '\0')
{
return true;
}
bool hasPath = false;
if(row >= 0 && row < rows && col >= 0
&& col < cols && matrix[row][col] == msg[length]
&&!visitedPoint[row][ col])
{
++length;
visitedPoint[row][col]= true;
hasPath = hasPathCore(matrix,rows,cols,row,col-1,msg,length,visitedPoint) || hasPathCore(matrix,rows,cols,row - 1,col,msg,length,visitedPoint)||
hasPathCore(matrix,rows,cols,row,col+1,msg,length,visitedPoint)||hasPathCore(matrix,rows,cols,row+1,col,msg,length,visitedPoint) ;
if(!hasPath)
{
--length;
visitedPoint[row][col] = false;
}
}
return hasPath;
}
bool HasPath(const char matrix[][4],int rows,int cols,const char* msg)
{
//合法检测
//找入口
int i = 0;
int j = 0;
bool visitedPoint[rows][4];
//memset(visitedPoint,0,sizeof(visitedPoint));
int length = 0;
for(; i < rows;i++)
{
for(; j < cols; j++)
{
if(matrix[i][j] == *msg)
{
memset(visitedPoint,0,sizeof(visitedPoint));
bool ret = CheckOutPath(matrix,rows,cols,i,j,msg,visitedPoint);
//这个是原来的代码
//bool ret = hasPathCore(matrix,rows,cols,i,j,msg,length,visitedPoint);
if(ret == true)
return true;
}
}
}
return false;
}
int main()
{
char* msg = "abc";
const char matrix[][4] =
{
{'a','b','c','d' },
{'e','f','g','h' },
{'i','g','k','l' },
{'m','n','o','p' },
};
bool ret = HasPath( matrix,3,4,msg);
printf("%d",ret);
}