请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的3x4的矩阵中包含一条字符串"bcced"的路径(路径中的字母用斜体表示)。但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
a b c e
s f c s
a d e e
本题使用回溯法来解决:
回溯法的一般步骤:
(1)针对所给问题,确定问题的解空间:(本例中为整个矩阵空间)
首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解。
(2)确定结点的扩展搜索规则:矩阵的行列大小、矩阵的值的字串的值相等、辅助矩阵是否访问
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
详细介绍:https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html
首先遍历整个矩阵,也就是字符数组,找到与目标字符数组相等的第一个字符char。同时生成标记数组并把该位置标记为true
在遍历这个char字符的4个方向的字符,如果有和目标字符数组中下一个字符相同的,就把该字符当成下次遍历的起点。
如果没有找到,回退到上一个字符(pathLength-1),重新遍历,直到目标字符数组为‘\0’
bool hasPathCore(char*Matrix,int rows,int cols,int row,int col,int pathLength,char*str,bool*visited)
{
if(str[pathLength]=='\0')
return true;
bool hasPath=false;
if(row>=0&&row<rows&&col>=0&&col<cols&&Matrix[row*cols+col]==str[pathLength]&&!visited[row*cols+col])
{
visited[row*cols+col]=true;
++pathLength;
hasPath=hasPathCore(Matrix,rows,cols,row-1,col,pathLength,str,visited)
|| hasPathCore(Matrix,rows,cols,row+1,col,pathLength,str,visited)
|| hasPathCore(Matrix,rows,cols,row,col-1,pathLength,str,visited)
|| hasPathCore(Matrix,rows,cols,row,col+1,pathLength,str,visited);
if(!hasPath){
--pathLength;
visited[row*cols+col]=false;
}
}
return hasPath;
}
bool hasPath(char* matrix,int rows,int cols,char* str)
{
if(matrix==NULL||rows<1||cols<1||str==NULL)
return false;
bool *visited=new bool[rows*cols];
memset(visited,0,rows*cols);
int pathLength=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(hasPathCore(matrix,rows,cols,i,j,pathLength,str,visited))
{
delete []visited;
return true;
}
}
}
delete [] visited;
return false;
}