【剑指offer12】矩阵中的路径(回朔法),C++实现
2024-10-19 08:43:39
1.题目
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如,在下面的3x4的矩阵中包含一条字符串"bfce"的路径,但矩阵中不包含"abcb"路径。因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
2.思路
回朔法判断矩阵中是否有字符串bfce的思路:
首先,在矩阵中查找和字符串第一个字符相同的矩阵元素b。然后,遍历矩阵元素b的上下左右四个字符,如果有和字符串下一个字符相同的矩阵元素f,则遍历矩阵元素f的上下左右四个字符……;如果没有和字符串下一个字符相同的矩阵元素f,则退到上一个字符,重新遍历。为了避免路径重复,需要一个辅助矩阵来记录路径。
3.code
# 返回值:是否存在路径,bool类型
# 参数:matrix矩阵,rows矩阵行数,cols矩阵列数,str字符串
class Solution {
public:
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; // 字符串下标
int row = 0; // 矩阵下标
int col = 0; // 矩阵下标
for(int row=0;row<rows;++row) // 遍历矩阵
for(int col=0;col<cols;++col){
if(hasPathCore(matrix,rows,cols,row,col,str,pathLength,visited)){
return true;
}
} delete[] visited; // 销毁路径数组 return false;
} private:
// 递归实现回朔法
bool hasPathCore(char* matrix,int rows,int cols,int row,int col,char* str,int &pathLength,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]){
++pathLength; // 矩阵中找到元素str[pathLength],应该找元素str[pathLength+1]
visited[row*cols+col] = true; // 路径矩阵做标记 // 查找矩阵坐标(row,col)上下左右是否存在与str[pathLength+1]相同的元素
hasPath = hasPathCore(matrix, rows, cols, row-1, col, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row+1, col, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col-1, str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col+1, str, pathLength, visited); // 矩阵坐标(row,col)上下左右不存在与str[pathLength+1]相同的元素
if(!hasPath){
--pathLength; // 条件不符合,还原为str[pathLength]
visited[row*cols+col] = false;// 条件不符合,标记数组标记row*cols+col为未被标记
}
}
return hasPath; }
};
最新文章
- bzoj3744 Gty的妹子序列
- Java面向对象之接口
- iOS 原生网络请求(推荐使用AFNetWorking库)
- JQuery 操作按钮遮罩(删除)
- Weka 入门2
- 浅谈Javase内存流程图
- PHP核心技术
- oracle12c:通过oracle客户端工具配置tns,并使用sqlldr进行批量导入数据
- excel日期拾取插件(支持Excel 2007 - 2016)
- 为啥百度、网易、小米都用Python?Python的用途是什么?
- 关于使用MUI框架ashx获取值的问题
- Facebook的一些基本操作(网页版)
- asp.net webapi 自定义身份验证
- 通过explain分析低效的SQL执行计划
- APP注册&;登陆 逻辑细节
- InertialNav
- urllib2特点--urllib2.build_opener对象接口
- Field &#39;***********&#39; doesn&#39;t have a default value
- SQLite使用入门
- MySQL导出表结构方法
热门文章
- ASP.NET OAuth Authorization - Difference between using ClientId and Secret and Username and Password
- Elasticsearch之几个重要的分词器
- scala中的高阶函数
- [Network Architecture]DPN(Dual Path Network)算法详解(转)
- 一些常用的CDN列表
- zlib编译方法
- P3600 随机数生成器
- RestTemplate请求https忽略证书认证
- 如何理解nRF5芯片外设PPI
- js实现类名的添加与移除