什么是回溯算法?
回溯法是一种系统搜索问题解空间的方法。为了实现回溯,需要给问题定义一个解空间
说到底它是一种搜索算法。只是这里的搜索是在一个叫做解空间的地方搜索。
而往往所谓的dfs,bfs都是在图或者树这种数据结构上的搜索。
根据定义来看,要实现回溯,需要两点1搜索2解空间
先看什么是解空间
就是形如数组的一个向量[a1,a2,....,an]。这个向量的每个元素都是问题的部分解,只有当这个数组的每一个元素都填满(得到全部解)的时候,才表明这个问题得到了解答。
再看搜索
最简单的就是for循环,上面的向量有n个维度,因此就是n个for循环。
形如:

for(求a1位置上的解)for(求a2位置上的解)for(求a3位置上的解)............for(求an位置上的解)

但是如果n是100?n是100000?那么如何回溯?
当然也可以写n个for循环,但是这样的程序会惨不忍睹。。。而且似乎10000个(不过往往回溯的时间复杂度太大,一般n不会这么大)for循环也很难写出来。。。
因此我们需要一种全新的书写回溯的方法。形如:

void backtrack(int i,int n,other parameters)
{if( i == n)
{//get one answer
record answer;
return;
}
//下面的意思是求解空间第i个位置上的下一个解
for(next ans in position i of solution space)
{backtrack(i+1,n,other parameters);
}
}

就是这么简单!!!
上面的模板适用于所有"解空间确定"的回溯法的问题!!!
上面的i代表解空间的第i个位置,往往从0开始,而n则代表解空间的大小。每一次的backtrack(i,n,other)调用,代表求解空间第i个位置上的解。而当i=n时,代表解空间上的所有位置的解都已经求出。
有了上述模板,我们就解决了搜索的问题。
因此几乎所有回溯的问题的难度都在于如何定义解空间
下面通过题目,带入模板,然后再看我的解答,来感知一下如何定义解空间。
全排列https://segmentfault.com/a/11...
即对没有重复数字的数组a=[a1,a2,a3,...an]求全排列。
解空间定义为s=[s1,s2,s3,....sn]与数字长度相同。s的每一个元素s【i】(i >= 0&&i < n),都为数组a中的任意元素a【j】(j >= 0&&j < n),不过要保证任意的s【i】不相等。
这里唯一复杂的地方是需要用一个boolean【】数组来表明哪些数已经用过,这样才能保证任意的s【i】不相等。
因此我们看到,回溯本身是很简单的,单纯的模板套用,难的在于需要根据回溯条件来定义各种别的变量,以及最后结果的记录。

探测路径https://leetcode-cn.com/probl... (这个下面给出ac 代码)
这个题很难,但是掌握了如何定义解空间之后再做这个题就会感觉是小儿科了。
这里的解空间s = [s1,s2,s3,....sn]中的每一个元素s【i】代表格子的坐标(x,y),因此从逻辑上来看,s应该是一个类类型的数组。不过,这个题求的是数目,而不是最后的确切路径,因此解空间在这里并没有记录。
java ac代码:

class Solution {int ans;public int uniquePathsIII(int[][] grid) {if(grid.length == 0)return 0;int num = 0;int x = 0,y = 0;for(int i = 0;i < grid.length;i++)for(int j = 0;j < grid[0].length;j++){if(grid[i][j] == 1||grid[i][j] == 0)num++;if(grid[i][j] == 1){x = i;y = j;}}backtrack(0,num,x,y,grid,new boolean[grid.length][grid[0].length]);return ans;}void backtrack(int i,int n,int x,int y,int[][]grid,boolean[][]flag){if(!(x >= 0 && x < grid.length && y >= 0 && y < grid[0].length)||flag[x][y]||grid[x][y] == -1)return;if(i == n && grid[x][y] == 2){ans++;return;}flag[x][y] = true;backtrack(i+1,n,x+1,y,grid,flag);backtrack(i+1,n,x-1,y,grid,flag);backtrack(i+1,n,x,y+1,grid,flag);backtrack(i+1,n,x,y-1,grid,flag);flag[x][y] = false;}
}

上面这个题的解空间应该有N+1个才对,但是为了方便书写,我只求出前n个位置的解,然后保证最后一个位置是终点即可。

回溯算法讲解--适用于leetcode绝大多数回溯题目相关推荐

  1. java回溯算法_回溯算法讲解--适用于leetcode绝大多数回溯题目

    什么是回溯算法? 回溯法是一种系统搜索问题解空间的方法.为了实现回溯,需要给问题定义一个解空间. 说到底它是一种搜索算法.只是这里的搜索是在一个叫做解空间的地方搜索. 而往往所谓的dfs,bfs都是在 ...

  2. 回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案

    回溯算法n皇后问题 N-皇后问题 (N - Queen's problem) The n – queen problem is the generalized problem of 8-queens ...

  3. 回溯算法详解:理论+基础类回溯题解

    文章目录 五:括号生成问题 六:组合总和(点击跳转) 七:子集问题(点击跳转) 五:括号生成问题 这个问题也比较经典,题目的要求是让你生成所有可能的并且 有效的 括号组合. 对于括号问题,两个特性,请 ...

  4. c语言回溯算法骑士周游,191-骑士周游回溯算法代码实现(1)

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  5. 「leetcode」最强回溯算法总结篇!历时21天、画了20张树形结构图、14道精选回溯题目精讲

    本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略.各个类型经典题目刷题顺序.思维导图,可以fork ...

  6. 回溯算法详细讲解(C语言)

    回溯算法实际上就是暴力枚举,只不过它有着递归的保护才得以由此美称,很多人也把该算法称作是万能解题法. 现在就让让我们一起走入这个使你头疼的算法吧. 要想讲解清楚这个算法还真不是一件容易的事情,所以能够 ...

  7. 从电影《蝴蝶效应》中学习回溯算法的核心思想

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 关注我们丨文末赠书 深度优先搜索算法利用的是回溯算法思想.这个算法思 ...

  8. 回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...

  9. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...

最新文章

  1. 使用OneFlow搭建神经网络
  2. 引入 JPEGCodec;JPEGImageEncoder; 图片处理(有的时候会报错)
  3. 在AWS第1部分中使用Terraform自动缩放组:基本步骤
  4. js与C#服务端 json数据交互
  5. java中的final的使用
  6. 机器学习基于语义特征的情感分析
  7. db2存储过程简单写法
  8. WindowsXP如何设置共享权限
  9. 前端网页字体优化指南
  10. 自动移动鼠标避免锁屏
  11. bt5使用教程----主要是渗透方面
  12. rm命令-每日Linux命令
  13. mysql 关键字 desc_mysql数据库表字段使用DESC等关键字报错及解决方法
  14. html 360登录自动填写,怎么让360安全浏览器记住以前登陆过的帐号和密码,每次都填很麻烦...
  15. 简单的Django系统模板
  16. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法
  17. 数据挖掘 沪深股市预测
  18. 电商后台设计:商品维护
  19. cs python课程 加州大学_cs选uci还是ucsd呢?
  20. 我泪流满面,比尔盖茨也老了

热门文章

  1. [转载] Unicode文本排序和Unicode数据库
  2. 【WPF/WAF】使用System.Windows.Interactivity交互事件
  3. 洛谷——P1155 双栈排序
  4. 已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数...
  5. Mutex对象是操作系统级?
  6. Windows7查看无线网络密码
  7. 手把手教你写个ORM(一)
  8. vbs获取程序窗体句柄_VBS调用windows api函数(postmessage)实现后台发送按键脚本...
  9. python django开发新闻聚合检索推荐_Django查询以检索符合相关选项卡上聚合条件的行...
  10. pyzabbix 删除触发器_zabbix设置邮件报警, Zabbix常用Key值, zabbix触发器表达式详解, zabbix制作自己模板...