
算法程序设计
文章平均质量分 64
大二下算法题目
Super XX.
这个作者很懒,什么都没留下…
展开
-
拼图游戏(搜索算法)
先构造一个优先队列,然后从空白格周围开始搜索,从上下左右四个方向找到可交换的位置,进行交换,然后把交换之后的状态放入优先队列中,从队列中取出队头元素,得到新的状态,将该状态与目标状态进行比较,若一样,则结束并返回此时交换次数,若不同,重复以上步骤,继续进行搜索。这是一个八数码问题,在一个3*3的棋盘上,随机放置0-8的数字,去掉一个数字,出现空位,用-1来填补,数字可以移动到空位,经过若干次移动后,可以实现指定目标。请给出使用优先队列搜索算法求解拼图游戏的【问题分析】和【算法伪代码】。原创 2023-04-16 10:56:24 · 1161 阅读 · 2 评论 -
优先队列搜索算法求解TSP问题(搜索算法)
并在搜索过程中,使用界限条件(当前结点已经走过的路径长度要小于已求得的最短路径)进行“剪枝”操作(不再对后续结点进行遍历),从而提高搜索效率。连接顶点间边的邻接矩阵大小为4行4列,位置[i,j]上元素值表示第i个顶点到第j个顶点的距离,0表示两个顶点间没有边连接。i++)//生成所有满足条件的子节点,加入open中。【输出形式】在整个算法过程中的先后搜索路径(最多输出20次最先搜索的路径),最优值和其中一条最优路径。输出:在整个算法过程中的先后搜索路径,最优值为25,最优路径为1->4->2->3。原创 2023-04-16 10:54:45 · 205 阅读 · 0 评论 -
深度优先搜索算法求解TSP问题(搜索算法)
【问题描述】采用深度优先搜索算法求解TSP问题,并在搜索过程中,使用界限条件(当前结点已经走过的路径长度要小于已求得的最短路径)进行“剪枝”操作(不再对后续结点进行遍历),从而提高搜索效率。连接顶点间边的邻接矩阵大小为4行4列,位置[i,j]上元素值表示第i个顶点到第j个顶点的距离,0表示两个顶点间没有边连接。【输出形式】在整个算法过程中的先后搜索路径(最多输出20次最先搜索的路径),最优值和其中一条最优路径。输出:在整个算法过程中的先后搜索路径,最优值为25,最优路径为:1->3->2->4。原创 2023-04-16 10:54:03 · 109 阅读 · 0 评论 -
最小生成树_prime(贪心算法)
连接顶点间边的权矩阵大小为8行8列,位置[i,j]上元素值表示第i个顶点到第j个顶点的距离,0表示两个顶点间没有边连接。【问题描述】Prim算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。【输出形式】顺序输出按照贪心选择得到的各顶点序号,及该顶点的前驱顶点序号,及路径长度。输出:顺序输出按照贪心选择得到的各顶点序号,及该顶点的前驱顶点序号,及路径长度。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。【评分标准】根据输入得到准确的输出。原创 2023-04-16 10:53:11 · 120 阅读 · 0 评论 -
最小生成树_kruskal(贪心算法)
并查集是一个数组parent,最刚开始将其初始化为-1,在实现kruskal算法时,先考虑在某一条边加入集合S之前,这条边的两个顶点是否在同一棵树上,即看这两个顶点的根节点是否相同。我们通过parent数组进行寻找:在一开始,parent数组初始化为-1,他们不会在同一棵树上,但后面S集合会不断更新,parent数组也不断更新,有些节点就会放在同一棵树上,这样我们就可以借助parent判断这条边是否与集合S中的边构成回路了。//权值小的排在前面。原创 2023-04-16 10:52:23 · 545 阅读 · 0 评论 -
哈夫曼编码(贪心算法)
说明:为了保证每个字符对应的Huffman编码的唯一性,对于所有测试样例,得到的Huffman编码树中,对于任何一个除叶结点以外的结点,其左儿子结点的频率小于其右儿子结点的频率(两者不会相等)。【问题描述】使用贪心算法求解Huffman编码问题,具体来说就是,根据每个字符的出现频率,使用最小堆构造最小优先队列,构造出字符的最优二进制表示,即前缀码。//将这两个合成一个新结点,新结点的权值是这两个结点权值之和,合成的新结点重新放回优先队列中,以此循环。【输入形式】在屏幕上输入字符个数和每个字符的频率。原创 2023-04-16 10:50:25 · 547 阅读 · 0 评论 -
0-1背包问题(动态规划)
【问题描述】使用动态规划算法解0-1背包问题,具体来说就是,依据递归式,按照顺序求得子问题,使得选择合适物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。void knapsack(int *v,int *w,int c,int n)//v向量,里面有n个元素 ,里面放的是每个物品的价值。输入:背包容量10、物品数量5、每件物品价值6, 3, 5, 4, 6和重量2, 2, 6, 5, 4。//n:背包容量c:物品数量。输出:最优解时选择物品的价值总和为15,编号为1,2,5。原创 2023-04-12 21:24:14 · 181 阅读 · 0 评论 -
凸多边形最优三角剖分(动态规划)
【问题描述】使用动态规划算法解凸多边形最优三角剖分问题,具体来说就是,依据递归式,按照顺序求得子问题,使得该三角剖分中诸三角形上权之和为最小。//n个顶点n-1条边 TraceBack函数是根据边来追踪的 所以要传n-1过去。//i是矩阵连乘(边合并)的起点 j是矩阵连乘(边合并)的重点。输入:顶点个数为7,每一行为一个顶点坐标,以空格分隔。//顶点i到顶点j的距离。【输入形式】在屏幕上输入凸多边形顶点个数和顶点坐标。//顶点i到顶点i的距离=0。输出:每一行为顺序产生的最优三角剖分后的三角形顶点。原创 2023-04-12 21:20:43 · 609 阅读 · 0 评论 -
最大子段和(分治递归)(动态规划)
【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。输出:序列的最大子段和20,得到最大子段和时的起始编号为2,终止编号为4。【输出形式】序列的最大子段和,及得到最大子段和时的起始和终止编号。【输入形式】在屏幕上输入一个序列元素,包含负整数、0和正整数。【评分标准】根据输入得到准确的输出。输入:6个数,元素间以空格分隔。原创 2023-04-12 21:19:22 · 170 阅读 · 0 评论 -
石子合并问题(动态规划)
如果有n堆石子,需要n-1次合并,可用k进行分隔,分为第1到第k堆和第k+1到第n堆,(k从1取到n-1),两部分分别求合并费用,k取使两部分的合并费用总和最小的那个值,最后再加上所有石子数量总和,即为整体的合并费用。在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。如果有三堆石子,需要两次合并,费用为第1堆和第2堆合并以及第2堆和第3堆合并费用中的较小值,加上三堆石子数量。//dp[i][j]表示从第i堆到第j堆合并的费用。原创 2023-04-12 21:20:45 · 1164 阅读 · 0 评论 -
最长公共子序列(动态规划)
序列X和Y的其中一个最长公共子序列,也就是当序列X和Y有多个最长公共子序列时,只输出其中的一个。这个输出的最长公共子序列选取的方法是:当xi不等于yj时,而c[i-1,j]==c[i,j-1],那么,c[i,j]是由c[i-1,j]得到的。其中c[i,j]中存放的是:序列Xi = {x1, ..., xi}和序列Yj = {y1, ..., yj}的最长公共子序列的长度。输出:序列X和Y的最长公共子序列为空,最长公共子序列的长度为0,最长公共子序列为:None。【评分标准】根据输入得到准确的输出。原创 2023-04-12 21:19:46 · 276 阅读 · 0 评论 -
动态规划算法解矩阵连乘(动态规划)
【问题描述】使用动态规划算法解矩阵连乘问题,具体来说就是,依据其递归式自底向上的方式进行计算,在计算过程中,保存子问题答案,每个子问题只解决一次,在后面计算需要时只要简单查一下得到其结果,从而避免大量的重复计算,最终得到多项式时间的算法。【输入形式】在屏幕上输入第1个矩阵的行数和第1个矩阵到第n个矩阵的列数,各数间都以一个空格分隔。输入:第1个矩阵的行数和第1个矩阵到第6个矩阵的列数,以一个空格分隔。【输出形式】矩阵连乘A1...An的最少数乘次数和最优计算次序。【评分标准】根据输入得到准确的输出。原创 2023-04-12 21:15:59 · 353 阅读 · 0 评论 -
第二章 快速排序(递归与分治)
【问题描述】每次划分时都以最后一个元素为划分基准,使用快速排序算法对若干整数进行排序,其中分解函数PARTITION以课件中的算法(1)为准。输出:第一行输出递归函数QUICKSORT调用的次数为9。第二行输出从小到大的排序结果,以空格分隔。【输出形式】输出递归函数调用的次数,以及从小到大的排序结果。【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。【评分标准】根据输入得到准确的输出。输入:7个整数,以空格分隔。原创 2023-04-09 21:48:14 · 74 阅读 · 0 评论 -
第二章 递归合并排序(递归与分治)
【问题描述】使用递归合并排序算法对若干整数进行排序。说明:在数组a的编号[left, right]范围内求取中间元素编号mid时,mid=floor((left+right)/2)。输出:第一行输出递归函数MergeSort调用的次数,第二行输出最终从小到大排序好的结果,整数间以一个空格分隔。【输出形式】输出递归函数MergeSort调用的次数和最终从小到大排序好的结果。【输入形式】在屏幕上输入若干整数,各数间都以一个空格分隔。【评分标准】根据输入得到准确的输出。输入:7个整数,以空格分隔。原创 2023-04-09 21:47:28 · 204 阅读 · 0 评论 -
第二章 二分搜索(递归与分治)
【问题描述】使用二分搜索方法,在有序数组中寻找特定的元素。说明:在数组a的编号[left, right]范围内求取中间元素编号mid时,mid=floor((left+right)/2)。【输入形式】在屏幕上输入若干个从小到大排列的互不相同的整数,各数间都以一个空格分隔。再输入要寻找的元素key,其中min<key<max,min和max分别为这些整数的最小值和最大值。输出:第一行为一次搜索的所在范围内的整数,第一次就搜索到了要寻找的特定元素35。【输出形式】输出每次搜索的所在范围内的整数。原创 2023-04-09 21:46:34 · 67 阅读 · 0 评论 -
第二章 全排列问题(递归与分治)
【输入形式】在屏幕上输入若干个整数,各数间都以一个空格分隔。输入:三个整数,分别为1,2,3,以空格分隔。输出:按照顺序每行输出一种排列方式,以空格分隔。【输出形式】按照顺序每行输出一种排列方式。【评分标准】根据输入得到准确的输出。【问题描述】对n个整数进行全排列。原创 2023-04-09 21:36:05 · 74 阅读 · 0 评论