【剑指offer刷题】--矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值