剑指offer-面试题12-矩阵中的路径-回溯法
/*
题目:
设计一个函数,判断一个矩阵中是否存在一条包含该字符串所有字符的路径。
路径可从字符串的任意一格开始,每一步可向上、下、左、右移动一格。
如果一条路径经过了矩阵中的某一格,那么该路径不能再次经过该格。
*/
/*
思路:
采用回溯法。
遍历数组,当选中其中一个格子时,若与当前字符串的指定位置匹配,
则检测它四周的格子是否匹配,若匹配,继续深入,不匹配,则回退一格。 */ #include <iostream>
#include<vector>
#include<string.h>
using namespace std; bool hasPathCore(const char* matrix,int rows,int cols,int row,int col,const char* str,int& lengthAt,bool* visited){
if(str[lengthAt] == '\0') return true;
if(row >=0 && col >=0 && row < rows && col < cols && !visited[cols*row+col] &&matrix[row*cols+ col] == str[lengthAt]){
visited[row*cols+ col] = true;
lengthAt++;
cout<<" "<<matrix[row*cols+col];
if(hasPathCore(matrix,rows,cols,row+1,col,str,lengthAt,visited) || hasPathCore(matrix,rows,cols,row-1,col,str,lengthAt,visited) ||
hasPathCore(matrix,rows,cols,row,col+1,str,lengthAt,visited) || hasPathCore(matrix,rows,cols,row,col-1,str,lengthAt,visited) ) {
return true;
}
--lengthAt;
visited[row*cols+col] = false;
} return false;
}
bool hasPath(char* matrix,int rows,int cols,char* str){
if(!matrix || rows <= 0 || cols <= 0 || !str){
return false;
}
bool* visited = new bool[rows*cols];
memset(visited,0,rows*cols);
int lengthAt = 0;
for(int row = 0; row < rows; row++){
for(int col = 0; col < cols; col++){
cout<<row<<" "<<col<<endl;
cout<<matrix[cols*row + col]<<" ";
if(hasPathCore(matrix,rows,cols,row,col,str,lengthAt,visited)){ return true;
}
cout<<endl;
}
}
return false;
} int main()
{
char matrix[] = "ABCEHJIG SFCSLOPQ ADEEMNOE ADIDEJFM VCEIFGGS";
//char* matrix = "abtgcfcsjdeh";
char str[] = "SGGFIECVAASABCEHJIGQEM";
cout<<hasPath(matrix,5,8,str);
return 0;
}
剑指offer-面试题12-矩阵中的路径-回溯法的更多相关文章
- 剑指offer(65)矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 【剑指Offer】65、矩阵中的路径
题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 【剑指Offer】面试题12. 矩阵中的路径
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...
- 《剑指offer》面试题12. 矩阵中的路径
问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该 ...
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...
- 剑指offer 面试题 删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 【剑指offer 面试题12】打印1到最大的n位数
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
随机推荐
- 研究微信红包分配算法之Golang版
今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...
- Go语言实现:【剑指offer】求1+2+3+...+n
该题目来源于牛客网<剑指offer>专题. 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). Go ...
- 使用chrome控制台调试js代码
1.打开控制台(空白页签即可) 2.将控制台在独立页打开(点击控制台右上角的三个点图标,然后点击如下图中的图标) 3.创建脚本编辑页面 4.页面区域说明 5.花键+回车之行代码 6.常用命令介绍 6. ...
- php 安装 event 和 libevent 扩展
这里使用的是php7.0.24 ,php是yum安装的 一.安装event扩展 用yum无法安装event扩展 手动安装 php 必须要开启 sockets 功能,需要安装php的socket扩展,才 ...
- php插件名称 yum安装
提示缺少 安装 DOM扩展模块 yum install php-xml PDO ...
- Springboot feign 传递request信息
基础实现 requestInterceptor 实现类中添加信息 public class NativeFeignConf { @Bean public RequestInterceptor getR ...
- NCE L5
课文内容 重点单词解析 重点课文解析
- opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值
直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...
- Microsoft.EntityFrameworkCore.Tools 相关命令
一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core. 二.程序包管理器控制台 为了能够在控制台中使用命令行来 ...
- SRAM结构框图解
SRAM 即静态RAM.它也由晶体管组成,SRAM的高速和静态特性使它们通常被用来作为Cache存储器.计算机的主板上都有Cache插座. 下图所示的是一个SRAM的结构框图. 由上图看出SRAM一般 ...