回溯算法

【DS】八皇后问题java代码

只谈情不闲聊 提交于 2020-01-23 15:39:29
八皇后问题简介:八 皇后 问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家 高斯 1850年提出:在8X8格的 国际象棋 上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在 柏林 的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法 解出92种结果 。计算机发明后,有多种方法可以解决此问题。 解决方法:回溯算法 Java代码: public class QueenPosition { private int x; private int y; public QueenPosition(int row, int column){ x = row; y = column; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } 这个类是用来存储皇后放置在棋盘上的位置的。 以下这个类是解法: import java.util.ArrayList; public class EightQueens { static

Java数据结构与算法精讲

被刻印的时光 ゝ 提交于 2020-01-23 03:19:40
课程简介 本系列视频教程为数据结构与算法基础,使用java语言描述,适合没有学过C/C++有一定Java基础的同学。没有Java基础的同学可以先行学习Java基础。 课程目录 ├─线性表 ├─栈和队列 ├─HashMap和LinkedHashMap ├─树 ├─二叉树 ├─图 ├─图的遍历与最小生成树 ├─图的最短路径与拓扑排序 ├─算法简介 ├─算法排序 ├─排序与归并 ├─递归与穷举 ├─贪心和分治 ├─动态规划和回溯 来源: CSDN 作者: di_pingxian 链接: https://blog.csdn.net/di_pingxian/article/details/103897423

回溯算法

柔情痞子 提交于 2020-01-22 11:07:17
回溯算法的理解(近似暴力解法求最优解) 回溯算法是穷举搜索的一个巧妙的实现,对某些应用场景的暴力的解法的工作量是具有显著的节省。 应用场景有新房子里面拜访家具的问题,到达具体的某一步如果出现问题退回上一步(和穷举的差异之处) 公路收费问题,收费公路的重建问题。 来源: CSDN 作者: 一行行、行行行、 链接: https://blog.csdn.net/qq_42664961/article/details/104055111

回溯算法--最优加工顺序

独自空忆成欢 提交于 2020-01-21 23:04:39
假期 2020.01 .21 题目描述 有k个机器零件{n1,n2,n3,…,nk},都需要现在1号机器上加工,然后再在2号机器上加工,求解如何安排加工方式可以使得消耗时间最少。 思路分析 如图,举例初始条件如下 举例两个顺序 我们会发现顺序不一样很大可能造成消耗时间不一样,并且在机器二上的消耗时间是基于当前机器一与机器二上的消耗时间的较大值作为基数,再增加机器二上面的耗时。 即f2 = max( f1 , f2 ) + current_secondtime; 算法分析 根据以上可得f2 = max( f1 , f2 ) + current_secondtime; 并且在满足f2小于最优值best_time时,可继续进一步搜索,而当f2大于best_time时,不需要进一步搜索了,因为此时任意增加一个零件,都会使f2大于当前的最优值,即后面不会出现最优解。 代码解析 # include <iostream> # include <algorithm> using namespace std ; constexpr int Maxsize = 100 ; typedef struct Node { int time_start ; int time_end ; } Data_part ; Data_part Time_part [ Maxsize ] ; int Count_part

算法:回溯十六 Add and Search Word添加并查找单词

核能气质少年 提交于 2020-01-20 13:34:52
题目 地址: https://leetcode.com/problems/add-and-search-word-data-structure-design/ Add and Search Word - Data structure design Design a data structure that supports the following two operations: void addWord ( word ) bool search ( word ) search(word) can search a literal word or a regular expression string containing only letters a-z or … A . means it can represent any one letter. Example: addWord ( "bad" ) addWord ( "dad" ) addWord ( "mad" ) search ( "pad" ) - > false search ( "bad" ) - > true search ( ".ad" ) - > true search ( "b.." ) - > true Note: You may assume that all words are consist of

“回溯”算法总结(深度优先遍历 + 状态重置 + 剪枝)

自作多情 提交于 2020-01-15 03:54:03
地址:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/ 首先解释“回溯”算法的应用,“回溯”算法主要用于搜索,因此有时候“回溯算法”也叫“回溯搜索”。这里“搜索”的意思即“查找我们所需要的解”。我们每天使用的“搜索引擎”就是帮助我们在庞大的互联网上搜索我们需要的信息。 而这里的“回溯”指的是“状态重置”,可以理解为“回到过去”、“恢复现场”,是在编码的过程中,为了节约空间而使用的一种技巧。 下面我们通过一个非常经典的问题,介绍“回溯”算法在查找问题的解中的应用。 这是「力扣」上第 46 号问题:“全排列”,这道题给我们一个没有重复数字的数组,要求我们返回其所有可能的全排列。 例如给出的数组是 [1, 2, 3] ,这个数组所有可能的全排列如下: [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ] 我们知道, N 个数字的全排列一共有 N ! N! N ! 这么多个。 大家可以尝试一下在纸上写 3 个数字、4 个数字、5 个数字的全排列,相信不难找到这样的方法。 例如数组 [1, 2, 3] 的全排列。 我们先写以 1 开头的全排列

算法:回溯十四 Restore IP Addresses数字字符串还原为IP地址(2种解法)

我只是一个虾纸丫 提交于 2020-01-13 23:17:35
题目 地址: https://leetcode.com/problems/restore-ip-addresses/ Given a string containing only digits, restore it by returning all possible valid IP address combinations. Example: Input : "25525511135" Output : [ "255.255.11.135" , "255.255.111.35" ] DFS回溯算法 思路解析: IP分为4个部分,每个部分的范围为 [0, 255] . 所以每个部分的判断逻辑分为如果第一位是0,那么长度只能为1;如果每个部分长度等于3,则校验数据不大于255. if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255)) 每部分的长度范围为 [1, 3] , 所以每个部分都有这个范围的循环。 合格终止条件,如果4个部分集齐,并且开始位置等于字符串的长度,则添加到结果列表。 异常终止条件,如果4个部分集齐,但是开始位置不等于字符串长度,则退出; 或者如果4个部分未集齐,但是开始位置已经大于等于字符串长度,则退出。 package

回溯算法之八皇后问题

坚强是说给别人听的谎言 提交于 2020-01-12 03:54:10
一、什么是回溯算法? 我们肯定都玩过迷宫游戏吧,比较复杂的迷宫,肯定是不可能第一遍就直接过了,只能一步一步地进行尝试。当走到一个死胡同时,只能退回到上一个分岔口进行重新选择。 数独游戏也是这样的,对于一个不确定的方格,我们就会先将这个方格可能出现的问题记录下来,一个一个地尝试,直到得到正确解。有着“通用解”称呼 所以,回溯算法就是类似于枚举的算法,将这一步的所以可能性一个一个地进行尝试。上边迷宫中的分岔口和数独中的可能出现多个数字的方格就是“回溯点” 二、有什么优缺点? 因为要对每一个点的可能情况都进行枚举测试,所以效率特别低,比如后边下边例子中的“八皇后问题”中,总共要进行15000次左右的运算,虽然对于计算机来说是很快的,但是更加复杂的问题,可能会更多 它可是有着“通用解”称呼,基本上大多数的这类问题都可以用此方法解决。 三、经典的“八皇后”问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。

回溯算法

江枫思渺然 提交于 2020-01-06 21:50:19
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解。显然,当需要枚举的时候,如果对每种情况都进行循环,那算法的复杂度要O(n^n)。因此,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯算法是一种leetcode刷题过程中出现频率比较高的题目。 针对这种算法,有些大佬总结了一种套路模板如下: def func(nums): n = len(nums) res = [] ... def backtracker(*args): ... backtracker(*args) return res 这里针对出现的题目进行一个总结 目录 46. 全排列 47. 全排列 II 39. 组合总和 40. 组合总和 II 46. 全排列 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 注意:1.append里面的是nums[:],意思是nums的深拷贝,如果直接写nums返回的结果都是原来的nums; 2.swap(first,i)的意义 def permute(self, nums: List[int]) -> List[List[int]]: n = len(nums) res = [] def backtracker(first): #相当于深拷贝nums,注意这里不可以直接用nums,否则结果没有差异 if first == n: res

回溯算法

戏子无情 提交于 2020-01-06 19:28:21
78.子集 基本思想:在每个子集中,nums中的每个元素都有“出现”和“不出现”两种可能,因此每个子集都可以表示为一棵二叉树中根节点到叶节点的路径。 方法一:DFS:搜索所有的从根节点到叶节点的路径即可得到所有子集。 方法二:回溯:搜索解空间并进行剪枝。 class Solution { public: //1.dfs void dfs(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){ if(level==nums.size()){ res.push_back(subset); return; } subset.push_back(nums[level]); dfs(res,nums,subset,level+1); subset.pop_back(); dfs(res,nums,subset,level+1); return; } //2.回溯 void backtracking(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){ if(level<=nums.size()){ res.push_back(subset); } for(int i=level;i<nums.size()