※剑指offer系列54:矩阵中的路径

这个题目用的是回溯法。

之前回溯法练得比较少,所以这个题还是需要重视。

回溯法是算法里学过的,就是从第一个可能得路径开始找,一直找到最后一个。

这个题目要注意一下几点:

1.从第一个开始找,如果第一个元素等于要寻找的字符串的第一个元素,就继续去寻找该元素的上下左右,看是否等于其下一个。一直匹配到最后一个元素。

2.如果这个元素的下一个在它的上下左右都找不到,就返回上一层,说明该元素也许走错了。

3.因为访问过得路径不能再次访问,因此要建立一个同样大小的bool型的变量记录该当前位置是否已经走过。

 1 class Solution {
 2 public:
 3     bool hasPath(char* matrix, int rows, int cols, char* str)
 4     {
 5         if (matrix == NULL || rows <= 0 || cols <= 0 || str == NULL)
 6             return false;
 7
 8         bool* visited = new bool[rows*cols];//定义一个跟矩阵同样大小的变量,记录每个位置是否被访问过
 9         memset(visited, 0, rows*cols);
10
11         int index = 0;
12         for(int i=0;i<rows;i++)
13             for (int j = 0; j < cols; j++)
14             {
15                 if (hasPathcore(matrix, rows, cols, i, j,str, index, visited))
16                     return true;
17             }
18         delete[]visited;
19         return false;
20     }
21     bool hasPathcore(char* matrix, int rows, int cols, int row,int col,char* str,int index,bool *visit)
22     {
23         if (str[index] == ‘\0‘)//递归终止条件,一直寻找到了结尾
24             return true;
25         bool has=false;
26         if (row <= rows&&col <= cols&&matrix[row*cols + col] == str[index] && !visit[row*cols + col])
27         {
28             visit[row*cols + col] = true;
29             index++;
30             //寻找字符串中剩下的
31             has = hasPathcore(matrix, rows, cols, row, col+1, str, index, visit)//右
32                 || hasPathcore(matrix, rows, cols, row+1, col, str, index, visit)//下
33                 || hasPathcore(matrix, rows, cols, row, col-1, str, index, visit)//左
34                 || hasPathcore(matrix, rows, cols, row-1, col, str, index, visit);//上
35
36             if (!has)//上下左右都没找到下一个元素,说明该元素走错了,退回上一步
37             {
38                 index--;
39                 visit[row*cols + col] = false;
40             }
41         }
42
43         return has;
44     }
45
46
47 };

原文地址:https://www.cnblogs.com/neverland0718/p/11268411.html

时间: 2024-07-31 01:47:35

※剑指offer系列54:矩阵中的路径的相关文章

剑指offer系列39-----矩阵中的路径

[题目]请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. * 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. * 如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. * 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径, * 因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. 1 package c

《剑指offer》:[66]矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 具体是例如下图: 上图中"bcced"就存在这条路径:但是"abcb"这条路径就不存在.因为进入'b'这个格子后就不能再次进入. 解决方案:主要是用回溯法.首先任意选一个入口地址,也就是任选一个格子,如果格子中的字符ch和字符串中的第一个字符相等,

剑指offer系列61---数组中的逆序对

[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统计子数组的逆序对: * 再合并,统计整个的逆序对. 1 package com.exe11.offer; 2 3 /** 4 * [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 5 * [思路]运用归并排序的思想.

剑指offer系列54---数组中出现次数超过一半的数

[题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. * [思路]首先取第一个数,之后的数与其比较.相同次数+1:不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1. * 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0: 1 package com.exe11.offer; 2 3 /**

剑指offer系列57---整数中1出现的次数

[题目]求出1~n的整数中1出现的次数.(10进制) 1 package com.exe11.offer; 2 /** 3 * [题目]求出1~n的整数中1出现的次数. 4 * @author WGS 5 * 6 */ 7 public class NumberOf1 { 8 9 public int getNumberOf1Between1AndN(int n){ 10 if(n<=0) return 0; 11 if(n<=9) return 1; 12 int count=0; 13 f

剑指offer系列24---数组中重复的数字

* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 书上方法: 1 package com.exe6.offer; 2 /** 3 * [24] 4 * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. 5 * 数组中某些

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

剑指offer系列——10.矩阵覆盖

Q:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T:@flysall 第一种情况等价于情形1中阴影部分的n-1块矩形有多少种覆盖方法,为f(n-1); 第二种情况等价于情形2中阴影部分的n-2块矩形有多少种覆盖方法,为f(n-2); 故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列.... A: int r

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.