![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法设计与分析
《算法设计与分析》课程作业代码
球王武磊
愿我们穿越阴霾,依然心怀太阳。
展开
-
【算法设计与分析】 优先队列搜索算法求解八数码问题(搜索算法)
【算法设计与分析】 优先队列搜索算法求解八数码问题(搜索算法)【问题描述】采用优先队列搜索算法求解八数码问题,用一最小堆来存储活结点表,其优先级是结点的估价函数值。估价函数值是状态的深度加上不在位的将牌数。采用heapq模块来实现最小堆。如果迭代3000次,还没有找到目标状态,则输出error。【输入形式】在屏幕上输入起始状态。【输出形式】如果找到目标状态,则显示从起始状态到目标状态的搜索路径;如果迭代3000次,还没有找到目标状态,则输出error。【样例1输入】2 8 31 6 47原创 2021-06-23 14:50:26 · 1345 阅读 · 2 评论 -
【算法设计与分析】 优先队列搜索算法求解TSP问题(搜索算法)
【算法设计与分析】 优先队列搜索算法求解TSP问题(搜索算法)【问题描述】采用优先队列搜索算法求解TSP问题,用一最小堆来存储活结点表,其优先级是结点的当前费用。并在搜索过程中,使用界限条件(当前结点已经走过的路径长度要小于已求得的最短路径)进行“剪枝”操作(不再对后续结点进行遍历),从而提高搜索效率。采用heapq模块来实现最小堆。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的邻接矩阵。【输出形式】在整个算法过程中的先后搜索路径(最多输出20次最先搜索的路径),最优值和其中一条最优路径。原创 2021-06-11 03:29:15 · 2103 阅读 · 3 评论 -
【算法设计与分析】 宽度优先搜索算法求解TSP问题(搜索算法)
【算法设计与分析】 宽度优先搜索算法求解TSP问题(搜索算法)【问题描述】采用宽度优先搜索算法求解TSP问题,并在搜索过程中,使用界限条件(当前结点已经走过的路径长度要小于已求得的最短路径)进行“剪枝”操作(不再对后续结点进行遍历),从而提高搜索效率。采用queue模块中的队列(Queue)来实现宽度优先搜索。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的邻接矩阵。【输出形式】在整个算法过程中的先后搜索路径(最多输出20次最先搜索的路径),最优值和其中一条最优路径。【样例输入】40 3原创 2021-06-11 03:27:57 · 1315 阅读 · 2 评论 -
【算法设计与分析】 深度优先搜索算法求解TSP问题(搜索算法)
【算法设计与分析】 深度优先搜索算法求解TSP问题(搜索算法)【问题描述】采用深度优先搜索算法求解TSP问题,并在搜索过程中,使用界限条件(当前结点已经走过的路径长度要小于已求得的最短路径)进行“剪枝”操作(不再对后续结点进行遍历),从而提高搜索效率。采用queue模块中的栈(LifoQueue)来实现深度优先搜索。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的邻接矩阵,边上的权可能有小数点。【输出形式】在整个算法过程中的先后搜索路径(最多输出20次最先搜索的路径),最优值和其中一条最优路径原创 2021-06-11 03:26:17 · 2157 阅读 · 2 评论 -
【算法设计与分析】 最小生成树 kruskal(贪心算法)
【算法设计与分析】 最小生成树 kruskal(贪心算法)【问题描述】Kruskal算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。使用最小堆数据结构寻找权值最小的边。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。【输出形式】顺序输出按照贪心选择加入到MST中的每条边的顶点编号(编号小的在前)及权值。【样例1输入】80 15 7 0 0 0 0 1015 0 0 0 0 0 0 07 0 0 9 12 5 0 0 0 0 9 0 0 0 0 00 0 12原创 2021-06-04 13:37:23 · 1254 阅读 · 2 评论 -
【算法设计与分析】 单源最短路径(贪心算法) Dijkstra
【算法设计与分析】 单源最短路径(贪心算法) Dijkstra【问题描述】Dijkstra算法解决的是带权重的有向图上单源最短路径问题。所有边的权重都为非负值。设置顶点集合S并不断地作贪心选择来扩充这个集合。使用最小堆数据结构构造优先队列。第1个顶点为源。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。【输出形式】从源到各个顶点的最短距离及路径。【样例输入】50 10 0 30 1000 0 50 0 00 0 0 0 100 0 20 0 600 0 0 0 0【样原创 2021-06-04 13:33:43 · 3477 阅读 · 2 评论 -
【算法设计与分析】 最小生成树 prime(贪心算法)
【算法设计与分析】 最小生成树 prime(贪心算法)【问题描述】Prim算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。Q使用最小堆数据结构。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。【输出形式】顺序输出按照贪心选择得到的各顶点序号,及该顶点的前驱顶点序号,及路径长度。【样例1输入】80 15 7 0 0 0 0 1015 0 0 0 0 0 0 07 0 0 9 12 5 0 0 0 0 9 0 0 0 0 00 0 12 0 0 6 0 00 0原创 2021-05-28 13:44:19 · 1162 阅读 · 6 评论 -
【算法设计与分析】 0-1背包问题(动态规划)
【算法设计与分析】 0-1背包问题(动态规划)【问题描述】使用动态规划算法解0-1背包问题,具体来说就是,依据递归式,按照顺序求得子问题,使得选择合适物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。【输入形式】在屏幕上输入背包容量、物品数量、每件物品价值和重量。【输出形式】最优解时所选物品的价值总和及其编号。【样例输入】1056 3 5 4 62 2 6 5 4【样例输出】151 2 5【样例说明】输入:背包容量10、物品数量5、每件物品价值6, 3,原创 2021-05-24 15:53:36 · 2591 阅读 · 2 评论 -
【算法设计与分析】 哈夫曼编码(贪心算法)
【算法设计与分析】哈夫曼编码(贪心算法)【问题描述】使用贪心算法求解Huffman编码问题,具体来说就是,根据每个字符的出现频率,使用最小堆构造最小优先队列,构造出字符的最优二进制表示,即前缀码。【输入形式】在屏幕上输入字符个数和每个字符的频率。【输出形式】每个字符的Huffman编码。【样例输入】645 13 12 16 9 5【样例输出】a 0b 101c 100d 111e 1101f 1100【样例说明】输入:字符个数为6,a至f每个字符的频率分别为:45,原创 2021-05-21 14:02:33 · 2003 阅读 · 2 评论 -
【算法设计与分析】 最短路径问题(动态规划)
【算法设计与分析】 最短路径问题(动态规划)【问题描述】假设一个矩阵mat的大小为M行N列,矩阵每个位置上有大于或等于0的整数,现从左上角[1, 1]开始,每次只能向下或向右走一步,最后到达右下角[M, N],路径上的数字累加就是路径和。现要求最短路径和以及最短的路径。【输入形式】在屏幕上输入矩阵大小,以及矩阵每个元素的值。【输出形式】最短路径和,以及最短路径。【样例1输入】4 41 3 5 98 1 3 45 0 6 18 8 4 0【样例1输出】121 11 22 2原创 2021-05-12 00:21:41 · 1577 阅读 · 3 评论 -
【算法设计与分析】 最大子段和(分治递归)
【算法设计与分析】 最大子段和(分治递归)【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。【输入形式】在屏幕上输入一个序列元素,包含负整数、0和正整数。【输出形式】序列的最大子段和,及得到最大子段和时的起始和终止编号。【样例输入】-2 11 -4 13 -5 -2【样例输出】2024【样例说明】输入:6个数,元素间以空格分隔。输出:序列的原创 2021-05-12 00:16:33 · 1185 阅读 · 4 评论 -
【算法设计与分析】 最大子段和(动态规划)
【算法设计与分析】 最大子段和(动态规划)【问题描述】使用动态规划算法解最大子段和问题,具体来说就是,依据递归式,按照顺序求得子问题。【输入形式】在屏幕上输入一个序列元素,包含负整数、0和正整数。【输出形式】序列的最大子段和,及得到最大子段和时的起始和终止编号。【样例输入】-2 11 -4 13 -5 -2【样例输出】2024【样例说明】输入:6个数,元素间以空格分隔。输出:序列的最大子段和20,得到最大子段和时的起始编号为2,终止编号为4。【题解代码】C++代码暂不发原创 2021-05-03 02:22:39 · 2368 阅读 · 2 评论 -
【算法设计与分析】 凸多边形最优三角剖分(动态规划)
【算法设计与分析】 凸多边形最优三角剖分(动态规划)【问题描述】使用动态规划算法解凸多边形最优三角剖分问题,具体来说就是,依据递归式,按照顺序求得子问题,使得该三角剖分中诸三角形上权之和为最小。【输入形式】在屏幕上输入凸多边形顶点个数和顶点坐标。【输出形式】最优三角剖分后的三角形顶点。【样例输入】78 260 200 1010 022 1227 2115 26【样例输出】012234024456046【样例说明】输入:顶点个数为7,每一行为一个顶点坐标(x,原创 2021-05-03 02:19:37 · 2269 阅读 · 2 评论 -
【算法设计与分析】 最长公共子序列(动态规划)
【算法设计与分析】 最长公共子序列(动态规划)【问题描述】使用动态规划算法解最长公共子序列问题,具体来说就是,依据其递归式自底向上的方式依次计算得到每个子问题的最优值。【输入形式】在屏幕上输入两个序列X和Y,序列各元素数间都以一个空格分隔。【输出形式】序列Xi = {x1, …, xi}和序列Yj = {y1, …, yj}的最长公共子序列的长度。序列X和Y的其中一个最长公共子序列,也就是当序列X和Y有多个最长公共子序列时,只输出其中的一个。这个输出的最长公共子序列选取的方法是:当xi不等于yj原创 2021-04-30 13:34:20 · 1920 阅读 · 6 评论 -
【算法设计与分析】 矩阵连乘(动态规划)
【算法设计与分析】 矩阵连乘(动态规划)【问题描述】使用动态规划算法解矩阵连乘问题,具体来说就是,依据其递归式自底向上的方式进行计算,在计算过程中,保存已子问题答案,每个子问题只解决一次,在后面计算需要时只要简单查一下得到其结果,从而避免大量的重复计算,最终得到多项式时间的算法。【输入形式】在屏幕上输入第1个矩阵的行数和第1个矩阵到第n个矩阵的列数,各数间都以一个空格分隔。【输出形式】矩阵连乘A1…An的最少数乘次数和最优计算次序。【样例输入】30 35 15 5 10 20 25【样例原创 2021-04-13 15:03:46 · 2045 阅读 · 7 评论 -
【算法设计与分析】 线性时间内寻找元素(递归与分治)
【算法设计与分析】 线性时间内寻找元素(递归与分治)【问题描述】每次都是优化选出一个元素(分组后的中位数)为划分基准,在线性时间内寻找第i小元素。提示:分组时的组的个数为n/5的向下取整;分组后的中位数取第(num_group/2向上取整)小的元素。【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。再输入要寻找的元素是数组从小到大顺序中第几个位置。【输出形式】输出第一次划分找到的基准元素以及数组从小到大顺序中要寻找的那个位置的元素。【样例输入】2 9 8 0 7 10 1 12 3原创 2021-04-06 00:41:27 · 1059 阅读 · 4 评论 -
【算法设计与分析】 棋盘覆盖问题 递归与分治
【算法设计与分析】 棋盘覆盖问题 递归与分治【问题描述】使用递归与分治策略解决棋盘覆盖问题【输入形式】在屏幕上输入棋盘大小及特殊方格所在行号和列号。【输出形式】输出使用L型骨牌进行棋盘覆盖结果。【样例1输入】21 2【样例1输出】2 -1 3 32 2 1 34 1 1 54 4 5 5【样例说明】输入:第一行输入整数k表示棋盘大小为2的k次幂,若k为2,则棋盘大小为4行4列;若k为3,则棋盘大小为8行8列。第二行输入特殊方格所在的行号和列号,以空格分隔,当前输入的:1原创 2021-03-27 00:16:56 · 829 阅读 · 9 评论 -
【算法设计与分析】 快速排序 递归与分治
【算法设计与分析】 快速排序 递归与分治【问题描述】每次划分时都以最后一个元素为划分基准,使用快速排序算法对若干整数进行排序,其中分解函数PARTITION以课件中的算法(1)为准。【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。【输出形式】输出递归函数调用的次数,以及从小到大的排序结果。【样例输入】48 38 65 97 76 13 27【样例输出】913 27 38 48 65 76 97【样例说明】输入:7个整数,以空格分隔。输出:第一行输出递归函数QUICKSOR原创 2021-03-27 00:12:10 · 844 阅读 · 2 评论 -
【算法设计与分析】 递归合并排序 递归与分治
【算法设计与分析】 递归合并排序【问题描述】使用递归合并排序算法对若干整数进行排序【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。【输出形式】输出递归函数调用的次数和最终从小到大排序好的结果。【样例输入】48 38 65 97 76 13 27【样例输出】1313 27 38 48 65 76 97【样例说明】输入:7个整数,以空格分隔。输出:第一行输出递归函数调用的次数,第二行输出最终从小到大排序好的结果,整数间以空格分隔。C++代码:#include <原创 2021-03-19 18:20:17 · 1072 阅读 · 2 评论 -
算法设计与分析 全排列问题
【算法设计与分析】 全排列问题(递归与分治)【问题描述】对n个整数进行全排列【输入形式】在屏幕上输入若干个整数,各数间都以一个空格分隔。【输出形式】按照顺序每行输出一种排列方式【样例输入】1 2 3【样例输出】1 2 31 3 22 1 32 3 13 2 13 1 2【样例说明】输入:三个整数,分别为1,2,3,以空格分隔。输出:按照顺序每行输出一种排列方式,以空格分隔【注意】这道题按照书上的递归算法来写,得到的结果并不是字典序。使用next_permutati原创 2021-03-12 16:33:13 · 908 阅读 · 4 评论 -
算法设计与分析 二分搜索
【算法设计与分析】 二分搜索(递归与分治)【问题描述】使用二分搜索方法,在有序数组中寻找特定的元素【输入形式】在屏幕上输入若干个从小到大排列的互不相同的整数,各数间都以一个空格分隔。再输入要寻找的元素key,其中min<key<max,min和max分别为这些整数的最小值和最大值。【输出形式】输出每次搜索的所在范围内的整数。若有序数组中存在该特定元素,则输出该元素在数组中的位置;若不存在,则输出0。【样例1输入】15 17 18 22 35 51 60 88 90 10018原创 2021-03-12 16:29:03 · 613 阅读 · 2 评论