在矩阵中考察回溯算法,分为任意起点、左上角开始等情况。从而有不同的模板,其实区别就是直接开始还是每个坐标都去尝试。

目录

1.首先是从左上角开始这种情况

C++代码

2.从矩阵任意一点开始的情况

C++代码:


1.首先是从左上角开始这种情况

剑指 Offer 13. 机器人的运动范围

难度中等291收藏分享切换为英文接收动态反馈

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

示例 1:

输入:m = 2, n = 3, k = 1
输出:3

示例 2:

输入:m = 3, n = 1, k = 0
输出:1

提示:

  • 1 <= n,m <= 100
  • 0 <= k <= 20

C++代码:

class Solution {vector<vector<int>> visit;
public:int sum(int x,int y){int res=0;while(x){res+=x%10;x/=10;}while(y){res+=y%10;y/=10;}return res;}int dfs(int x, int y, int m, int n, int k){if(x < 0 || x >= m || y < 0 || y >= n || visit[x][y] || sum(x, y)>k) return 0;visit[x][y] = 1;return dfs(x-1,y,m,n,k)+dfs(x,y-1,m,n,k)+dfs(x+1,y,m,n,k)+dfs(x,y+1,m,n,k)+1;}int movingCount(int m, int n, int k) {if(k == 0) return 1;//k等于0应该输出1visit.resize(m, vector<int>(n, 0));return dfs(0, 0, m, n, k);}
};

2.从矩阵任意一点开始的情况

剑指 Offer 12. 矩阵中的路径

难度中等323收藏分享切换为英文接收动态反馈

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • board 和 word 仅由大小写英文字母组成

C++代码:

class Solution {vector<vector<int>> visit;const  int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};//定义上下左右四个方向public:bool check(vector<vector<char>>& board, string word, int i, int j, int k){if(i >= board.size() || i < 0 || j >= board[0].size() || j < 0 || visit[i][j] || board[i][j] != word[k])return false;if(k == word.size() - 1) return true;char tmp = board[i][j];visit[i][j] = 1;for(int d = 0; d < 4; d++){if(check(board, word, i + dx[d], j + dy[d], k+1)) return true;}visit[i][j] = 0;return false;}bool exist(vector<vector<char>>& board, string word) {int row = board.size(), col = board[0].size(), len = word.size();visit.resize(row, vector<int>(col, 0));if(len > row*col || word.empty()) return false;for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(check(board, word, i, j, 0))return true;}}return false;}
};

可以直接改变字符数组,节约访问记录数组空间。

class Solution {vector<vector<int>> visit;const  int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};//定义上下左右四个方向public:bool check(vector<vector<char>>& board, string word, int i, int j, int k){if(i >= board.size() || i < 0 || j >= board[0].size() || j < 0 || visit[i][j] || board[i][j] != word[k])return false;if(k == word.size() - 1) return true;char tmp = board[i][j];board[i][j] = '/';      //占位符 访问过的就不再管//visit[i][j] = 1;for(int d = 0; d < 4; d++){if(check(board, word, i + dx[d], j + dy[d], k+1)) return true;}board[i][j] = tmp;  //回溯的时候需要复原//visit[i][j] = 0;return false;}bool exist(vector<vector<char>>& board, string word) {int row = board.size(), col = board[0].size(), len = word.size();visit.resize(row, vector<int>(col, 0));if(len > row*col || word.empty()) return false;for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(check(board, word, i, j, 0))return true;}}return false;}
};

回溯法模板(矩阵中操作)相关推荐

  1. 《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围

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

  2. 算法---回溯法--模板解法

    回溯法问题:实际上就是一个决策树的遍历过程 分为三步: 路径:已做出选择的路径. 选择列表:当前可以做的选择 结束条件:就是到达决策树的底层,无法再做出选择的条件.(退出条件 ) template&l ...

  3. 回溯法求矩阵最大连通块数

    题目: 编写程序,读入矩阵行数.列数及所有矩阵元素,矩阵中所有元素均为正整数,计算并打印出矩阵中的最大连通块数.注:如果两个元素值相同,并且上.下.左.右四个方向之一相邻,则称两个元素是连通的;连通关 ...

  4. DFS中的回溯法(纯暴力穷举)

    首先回溯法是深度搜索(DFS)的一种,即把所有可能穷举,根据条件筛选出符合条件的路径. 回溯法模板格式 dfs(...){//根据递归终止条件进行筛选 if(符合需要的条件){存储合理路径 retur ...

  5. Leetcode回溯法四板一解模板

    文章目录 1 通用回溯法模板 2 回溯法常用四板斧+一解(first索引+inPath+sort相邻去重+set非相邻去重) 附录:本专题刷题列表 致谢 1 通用回溯法模板 vector<xxx ...

  6. 算法笔记之回溯法(一)——溯洄从之,道阻且长;溯游从之,宛在水中央。

    回溯法理论基础 回溯法是一种搜索算法,从本质上来说,回溯法是一种穷举法,穷尽其所有可能而举其可行解:尽管回溯法有剪枝等操作,但也只是去除一些明显不可行的部分,仍改变不了回溯法暴力搜索的本质. 虽然回溯 ...

  7. 消消乐实验回溯法(深大算法实验3)报告+代码

    实验代码 + 报告资源: 链接: https://pan.baidu.com/s/1CuuB07rRFh7vGQnGpud_vg 提取码: ccuq 目录 写在前面 实验要求 求解问题的算法原理描述 ...

  8. 剑指Offer 12—矩阵中的路径

    题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元 ...

  9. 回溯法专题--回溯法总结

    文章目录 前言 看到题目有 "所有" 两个字,先看看回溯法能不能解决 一.问题一: 二.解决主要问题 三.回溯法模板 前言 回溯法 - - 本质就是利用递归算法 是纯暴力搜索 - ...

最新文章

  1. Android 开发应该掌握的 Proguard 技巧
  2. 基于 linux 平台的 libpcap 源代码分析
  3. Objective-C语法之代码块(block)的使用
  4. python是动态编程语言吗-python是一种跨平台、开源、免费的高级动态编程语言,对么...
  5. Access转Sql Server问题
  6. 重温《数据库系统概论》【第一篇 基础篇】【第4章 数据库安全性】
  7. We7 CMS 2.7beta3 版发布!SVN源码同步开放
  8. (C语言)人名排序,字符串排序
  9. 手机看直播时卡屏幕显示无法连接服务器,看直播不再卡!教你几招提升网速方法...
  10. 基于springboot+vue的(高考)志愿录取系统(前后端分离)
  11. Kvaser:CAN(FD)总线测试、开发仿真和控制
  12. Restarting data prefetching from start repeated many times one by one. why?
  13. php 微信 图片 文字 朋友圈,朋友圈实现图片+文字转发功能(必看篇)
  14. matlab DSB-AM与SSB-AM的调制与解调
  15. 苹果计算机安装应用软件,Mac苹果电脑怎么安装软件 Mac苹果电脑安装软件新手教程...
  16. cshop是什么开发语言_2019编程语言哪一款最适合你?
  17. 从零开始学黑苹果-基础安装教程(10.11.6)
  18. UnityC#字串如何获取换行符号-最基础的字串处理方法,也最容易常见错误
  19. ACM Plan UVa - 168 Theseus and the Minotaur(图的遍历,深度优先)
  20. uvm打印信息冗余度和重载打印信息

热门文章

  1. z.lua 1.7.0 发布,快速回到历史路径,支持 ranger / fz
  2. BurpSuite 代理设置的小技巧
  3. bootstrap42-Bootstrap 按钮组
  4. 基本数据结构之BinarySearchTree
  5. 如何在Eclipse中查看Android源码或者第三方组件包源码
  6. Step by Step Setup Git Server on Windows with CopSSH + msysGit and Integrate Git with Visual Studio
  7. PHPRPC for PHP
  8. V2EX › 郁闷于Python GUI开发,有没有好的框架啊?
  9. red hat 5 和 oracle
  10. 快速撑握C#知识点之变量,类型及类型转换