// 面试题:矩阵中的路径
// 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有
// 字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、
// 上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入
// 该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字
// 母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个
// 字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
// A B T G
// C F C S
// J D E H #include <string> using namespace std; bool hasPathCore(const char* matrix, int rows, int cols, int row, int col, const char* str, int& pathLength, bool* visited); bool hasPath(const char* matrix, int rows, int cols, const char* str)
{
if (matrix == nullptr || rows < || cols < || str == nullptr)//负面测试
return false; bool *visited = new bool[rows * cols];//用来检测某个节点是否已经走过了
memset(visited, , rows * cols);//将开辟出来的visitedp[rows * cols]里都设为0 int pathLength = ;//待检测字符长度变量
for (int row = ; row < rows; ++row)
{
for (int col = ; col < cols; ++col)
{
if (hasPathCore(matrix, rows, cols, row, col, str, pathLength, visited))//遍历每个点,作为起点,开始检测
{
delete[] visited;
return true;
}
}
} delete[] visited; return false;
} bool hasPathCore(const char* matrix, int rows, int cols, int row,
int col, const char* str, int& pathLength, bool* visited)
{
if (str[pathLength] == '\0')//递归停止条件一,我经找到最后一个字符了,查找完毕,返回正确
return true; bool hasPath = false;
if (row >= && row < rows && col >= && col < cols
&& matrix[row * cols + col] == str[pathLength]
&& !visited[row * cols + col])//这个是我没有走过的节点中,那符合我现在查找的字符A吗
{
++pathLength;//符合,那找下个字符B
visited[row * cols + col] = true;//这个点在这个起点的时候,我走过了 hasPath = hasPathCore(matrix, rows, cols, row, col - ,
str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row - , col,
str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row, col + ,
str, pathLength, visited)
|| hasPathCore(matrix, rows, cols, row + , col,
str, pathLength, visited);//以上下左右节点分别为起点检测字符B if (!hasPath)//完了走不通
{
--pathLength;//这个节点A以后的没希望了,那我退回一下,继续找A
visited[row * cols + col] = false;//那当我这个点没走过吧
}
} return hasPath;
} // ====================测试代码====================
void Test(const char* testName, const char* matrix, int rows, int cols, const char* str, bool expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (hasPath(matrix, rows, cols, str) == expected)
printf("Passed.\n");
else
printf("FAILED.\n");
} //ABTG
//CFCS
//JDEH //BFCE
void Test1()
{
const char* matrix = "ABTGCFCSJDEH";
const char* str = "BFCE"; Test("Test1", (const char*)matrix, , , str, true);
} //ABCE
//SFCS
//ADEE //SEE
void Test2()
{
const char* matrix = "ABCESFCSADEE";
const char* str = "SEE"; Test("Test2", (const char*)matrix, , , str, true);
} //ABTG
//CFCS
//JDEH //ABFB
void Test3()
{
const char* matrix = "ABTGCFCSJDEH";
const char* str = "ABFB"; Test("Test3", (const char*)matrix, , , str, false);
} //ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS //SLHECCEIDEJFGGFIE
void Test4()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SLHECCEIDEJFGGFIE"; Test("Test4", (const char*)matrix, , , str, true);
} //ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS //SGGFIECVAASABCEHJIGQEM
void Test5()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEHJIGQEM"; Test("Test5", (const char*)matrix, , , str, true);
} //ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS //SGGFIECVAASABCEEJIGOEM
void Test6()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEEJIGOEM"; Test("Test6", (const char*)matrix, , , str, false);
} //ABCEHJIG
//SFCSLOPQ
//ADEEMNOE
//ADIDEJFM
//VCEIFGGS //SGGFIECVAASABCEHJIGQEMS
void Test7()
{
const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
const char* str = "SGGFIECVAASABCEHJIGQEMS"; Test("Test7", (const char*)matrix, , , str, false);
} //AAAA
//AAAA
//AAAA //AAAAAAAAAAAA
void Test8()
{
const char* matrix = "AAAAAAAAAAAA";
const char* str = "AAAAAAAAAAAA"; Test("Test8", (const char*)matrix, , , str, true);
} //AAAA
//AAAA
//AAAA //AAAAAAAAAAAAA
void Test9()
{
const char* matrix = "AAAAAAAAAAAA";
const char* str = "AAAAAAAAAAAAA"; Test("Test9", (const char*)matrix, , , str, false);
} //A //A
void Test10()
{
const char* matrix = "A";
const char* str = "A"; Test("Test10", (const char*)matrix, , , str, true);
} //A //B
void Test11()
{
const char* matrix = "A";
const char* str = "B"; Test("Test11", (const char*)matrix, , , str, false);
} void Test12()
{
Test("Test12", nullptr, , , nullptr, false);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
Test10();
Test11();
Test12();
system("pause");
return ;
}

《剑指offer》第十二题(矩阵中的路径)的更多相关文章

  1. 剑指Offer(书):矩阵中的路径

    题目: * 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.* 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.* 如果一条路径经 ...

  2. 【剑指Offer】面试题12. 矩阵中的路径

    题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...

  3. 《剑指offer》面试题12. 矩阵中的路径

    问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该 ...

  4. 剑指offer(一):二维数组中的查找

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  5. 剑指offer三十五之数组中的逆序对

    一.题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  6. 剑指offer笔记面试题12----矩阵中的路径

    题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...

  7. 算法学习之剑指offer(十二)

    一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

  8. 剑指 offer set 1 二维数组中查找

    总结 1. 二维数组搜索题遇到两个了, 一个是 Leetcode 上 search in 2D matrix. 那道题比较简单, 因为下一行的所有元素大于上一行的. 这道题对二维矩阵的要求比较松, 起 ...

  9. 【剑指Offer】04. 二维数组中的查找 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://leetcode-cn.com/ ...

  10. 【剑指 Offer】04.二维数组中的查找

    题目描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

随机推荐

  1. C语言进阶之路(三)----野指针的产生原因及解决办法

    1.会产生野指针的做法 #include <stdio.h> //这就是一种错误的写法 int main(){ int *p = NULL; p = (); //释放P所指向的内存空间,但 ...

  2. HDU 4500 小Q系列故事——屌丝的逆袭(简单题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4500 AC代码: #include<math.h> #include<stdio.h> ...

  3. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  4. Perl中的输入输出流(三)

    Perl中读取标准输入:<STDIN> foreach (<STDIN>)  { print "I saw $_";} 钻石操作符<>:它的参数 ...

  5. Python: re.IGNORECASE 标志参数字符串忽略大小写的搜索替换

    为了在文本操作时忽略大小写,需要在使用re 模块的时候给这些操作提供re.IGNORECASE 标志参数.比如 >>> text = 'UPPER PYTHON, lower pyt ...

  6. 返回xml过长时被nginx截断的解决办法

    返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...

  7. SNMP学习笔记之Linux下安装和配置SNMP

    注意:本篇安装用户是root,非root用户启动的时候会报缺少文件错误. 一.安装SNMP 1.1.下载Net-SNMP的源代码 选择一个SNMP版本,比如5.7.1,下载地址如下:http://so ...

  8. 20145318《网络对抗》MSF基础应用

    20145318 <网络对抗> MSF基础应用 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067;(2)一 ...

  9. 2018-2019-1 1723《程序设计与数据结构》第3&4周作业 总结

    作业要求 第三周作业: 提交情况如图: 第四周作业: 提交情况如图: 作业问题 1.问题总结方面希望大家的解决过程不要完全复制百度出来的或者其他博客的内容.因为很明显,没有自己的思考过程.可以先把参考 ...

  10. STM32系统时钟为什么没有定义呢

    对于使用3.5版本库开发的STM32学习者 有时候不清楚为什么没有时钟定义 那么我们就简单的讲解下吧: 1,函数从启动文件开始运行(汇编文件) 2,若是hd.s 请看151行LDR     R0, = ...