剑指offer---矩阵中的路径

115 篇文章 0 订阅
67 篇文章 1 订阅

题目描述

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

a b t g
c f c s
j d e h

矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解题思路:
使用深度优先搜索遍历来实现

class Solution {
public:
	
	//************************************
	// Method:    dfs 矩阵中的路径
	// FullName:  dfs
	// Access:    public 
	// Returns:   bool
	// Qualifier:
	// Parameter: char * matrix 给定矩阵
	// Parameter: int rows 矩阵的行
	// Parameter: int cols 矩阵的列
	// Parameter: char * str 给定匹配字符串
	// Parameter: int i 当前字符的行
	// Parameter: int j 当前字符的列
	// Parameter: int k 当前字符在 str 中的位置
	// Parameter: bool * dp 访问数组
	//************************************
	bool dfs(char* matrix, int rows, int cols, char* str, int i, int j, int k, bool* dp) {
		//因为是一维数组存放的矩阵
		int index = cols * i + j;//相当于二维矩阵的 matrix(i,j)
		if (i < 0 || i >= rows || j < 0 || j >= cols || matrix[index] != str[k] || dp[index] == true)
		{
			//dp[index] = true 表示该字符已经被访问过了
			return false;
		}
		if (str[k+1] == '\0')//字符串查找结束
		{
			return true;
		}
		dp[index] = true;
		if (dfs(matrix,rows,cols,str,i - 1,j,k + 1,dp) ||
			dfs(matrix,rows,cols,str,i,j - 1,k + 1,dp) ||
			dfs(matrix,rows,cols,str,i + 1,j,k + 1,dp) ||
			dfs(matrix,rows,cols,str,i,j + 1,k + 1,dp)
			)
		{
			return true;
		}
		dp[index] = false;//恢复到原来的状态
		return false;
	}
	
	
	bool hasPath(char* matrix, int rows, int cols, char* str) {
		if (matrix == NULL || str == NULL || rows <= 0 || cols <= 0)
		{
			return false;
		}
		bool* dp = new bool[rows * cols];
		/*
		
		memset 是按照字节对待初始化空间进行初始化的,
		也就是说,函数里面的第二个参数的那个初值(一般为0)是按照一个一个字节往第一个参数所指区域赋值的,
		所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
		而如果初始化为其他的值,就会一个字节一个字节的进行赋值,从而出现奇怪的结果。
		*/
		memset(dp, false, rows * cols);
		for (int i = 0;i < rows;i++)
		{
			for (int j = 0; j < cols; j++)
			{
				if ( dfs(matrix, rows, cols, str, i, j, 0, dp) )
				{
					return true;
				}
			}
		}
		delete[] dp;
		return false;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值