![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典算法问题C/C++
使用c/c++语言解决一些经典算法问题,巩固所学内容
Fmm-PMO
是非在己,毁誉由人,得失不论。
展开
-
7-7 小字辈(左子右兄加强版) (30分)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。需要注意的是,家族成员的输入方式,是按照“Left-child Right-sibling”(左儿子 右兄弟)的格式【敲黑板】sibling的意思是兄弟/姐妹,是亲兄弟,不是“表兄弟”!2019年春季PAT中不认识单词sibling的孩纸请牢记……注:本题是在浙江大学陈越老师的GPLT-2018决赛L2-2题目“小字辈”题意基础上改编而成。输入格式:输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族原创 2020-12-23 17:47:02 · 640 阅读 · 0 评论 -
7-1 交换二叉树中每个结点的左孩子和右孩子 (30分)
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。输入格式:输入二叉树的先序序列。提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。输出格式:输出有两行:第一行是原二叉树的中序遍历序列;第二行是交换后的二叉树的中序遍历序列。输入样例:ABC##DE#G##F###输出样例:CBEGDFAAFDGEBCemmm,考试的时候出了点问题,想成了是交换既有做孩子又有右孩子结点的左右孩子,所以。。现在又做了原创 2020-12-17 13:42:58 · 10522 阅读 · 4 评论 -
11-散列2 Hashing (25分)
The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be H(key)=key%TSize where TSize is the maximum size of the hash table. Qua原创 2020-12-16 21:38:58 · 174 阅读 · 0 评论 -
09-排序2 Insert or Merge (25分)
According to Wikipedia:Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, an原创 2020-11-25 08:06:04 · 174 阅读 · 0 评论 -
2-2 畅通工程之局部最小花费问题 (30分)(Kruskal)
某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。输入格式:输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/2行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N原创 2020-11-19 17:39:33 · 586 阅读 · 0 评论 -
2-3 社交网络图中结点的“重要性”计算 (25分)
在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同。“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有N个结点的网络中,结点vi的“紧密度中心性”Cc(vi )数学上定义为v原创 2020-11-19 16:17:38 · 1638 阅读 · 1 评论 -
07-图6 旅游规划 (25分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中原创 2020-11-15 22:20:33 · 199 阅读 · 0 评论 -
07-图4 哈利·波特的考试 (25分)
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问原创 2020-11-14 21:35:22 · 233 阅读 · 0 评论 -
L2-026 小字辈 (25分)(另类并查集)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。输出格式:首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。输入样例:原创 2020-11-13 20:37:05 · 747 阅读 · 0 评论 -
04-树6 Complete Binary Search Tree (30分)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:The left subtree of a node contains only nodes with keys less than the node’s key.The right subtree of a node contains only nodes with keys greater than原创 2020-11-12 16:48:39 · 154 阅读 · 0 评论 -
03-树3 Tree Traversals Again (25分)(两种方法)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(原创 2020-11-11 14:08:58 · 362 阅读 · 2 评论 -
06-图3 六度空间 (30分)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的原创 2020-11-11 09:24:15 · 223 阅读 · 0 评论 -
7-2 树种统计 (20分)
随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。输入格式:输入首先给出正整数N(≤105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。输出格式:按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。输入样例:29Red AlderAshAspenBasswoodAshBeechYellow Birch原创 2020-11-10 22:42:01 · 329 阅读 · 0 评论 -
6-2 邻接表存储图的广度优先遍历 (20分)
试实现邻接表存储图的广度优先遍历。函数接口定义:void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );其中LGraph是邻接表存储的图,定义如下:/* 邻接点的定义 */typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /* 指向下一个邻接点的指针原创 2020-11-10 22:14:25 · 14051 阅读 · 3 评论 -
6-1 邻接矩阵存储图的深度优先遍历 (20分)
试实现邻接矩阵存储图的深度优先遍历。函数接口定义:void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );其中MGraph是邻接矩阵存储的图,定义如下:typedef struct GNode *PtrToGNode;struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接原创 2020-11-10 21:45:18 · 1689 阅读 · 0 评论 -
7-3 顺序存储的二叉树的最近的公共祖先问题 (20分)
设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。输入格式:输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。题目保证输入正确对应一棵二叉树,且1≤i,j≤n。输出格式:如果i或j对应的是空结点,则输出ERROR: T[x] is NULL,其中x是i或j中先发现错误的那个编号;否则在一行中输出编号为i和j的两原创 2020-11-08 16:49:38 · 346 阅读 · 0 评论 -
05-树8 File Transfer (25分)
We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other?Input Specification:Each i原创 2020-11-08 16:34:37 · 205 阅读 · 0 评论 -
【MOOC】03-树1 树的同构 (25分)
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点原创 2020-11-06 20:44:16 · 174 阅读 · 0 评论 -
02-线性结构1 两个有序链表序列的合并 (15分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。函数接口定义:List Merge( List L1, List L2 );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */原创 2020-11-05 23:13:17 · 315 阅读 · 1 评论 -
4-11 Isomorphic (10分)
Two trees, T1 and T2, are isomorphic if T1 can be transformed into T2 by swapping left and right children of (some of the) nodes in T1. For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not原创 2020-10-29 13:10:23 · 318 阅读 · 0 评论 -
4-13 先序输出叶结点 (10分)
本题要求按照先序遍历的顺序输出给定二叉树的叶结点。函数接口定义:void PreorderPrintLeaves( BinTree BT );其中BinTree结构定义如下:typedef struct TNode *Position;typedef Position BinTree;struct TNode{ ElementType Data; BinTree Left; BinTree Right;};函数PreorderPrintLeaves应按照先序遍历原创 2020-10-28 19:58:20 · 422 阅读 · 0 评论 -
4-15 根据后序和中序遍历输出先序遍历 (15分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。输入格式:第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。输出格式:在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:Preorder: 4 1 3 2 6 5 7做树的题,通常原创 2020-10-28 19:43:54 · 466 阅读 · 0 评论 -
【MOOC】04-树4 是否同一棵二叉搜索树 (25分)
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查原创 2020-10-22 14:30:57 · 183 阅读 · 0 评论 -
3-5 单链表分段逆转 (20分)(都啥玩意?)
给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。函数接口定义:void K_Reverse( List L, int K );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ Ptr原创 2020-10-21 10:03:10 · 766 阅读 · 0 评论 -
3-1 Deque (20分)
A “deque” is a data structure consisting of a list of items, on which the following operations are possible:Push(X,D): Insert item X on the front end of deque D.Pop(D): Remove the front item from deque D and return it.Inject(X,D): Insert item X on the原创 2020-10-21 08:33:08 · 557 阅读 · 0 评论 -
3-3 另类循环队列 (20分)
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。函数接口定义:bool AddQ( Queue Q, ElementType X );ElementType DeleteQ( Queue Q );其中Queue结构定义如下:typedef int Position;typedef struct QNode *PtrToQNode;struct QNode { ElementType原创 2020-10-17 22:25:17 · 181 阅读 · 0 评论 -
3-8 求前缀表达式的值 (20分)(细节分析)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。输入格式:输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。输出格式:输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。输入样例:2 * 3 - 7 4 / 8 4输出样例:原创 2020-10-17 20:43:51 · 939 阅读 · 0 评论 -
2-10 出栈序列的合法性 (20分)
给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, …, N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5、N=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。输入格式:输入第一行给出 3 个不超过 1000 的正整数:M(堆栈最大容量)、N(入栈元素个数)、K(待检查的出栈序列个数)。最后 K 行,每行给出 N 个数字的出栈序列。所有同行数字以空格间隔。输出格式:对每一原创 2020-10-07 10:26:45 · 878 阅读 · 0 评论 -
1-3 表达式转换 (25分)(我的偶像是大佬)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。输入格式:输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出格式:在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。输入样例:2+3*(7-4)+8/4输出样例:2 3 7 4 - * + 8 4 / +主要是逆波兰原创 2020-10-05 13:50:57 · 513 阅读 · 0 评论 -
【MOOC】05-树7 堆中的路径 (25分)(建立最小堆)
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。输出格式:对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。输入样例:5 346 23 26 24 105 4原创 2020-10-04 23:21:27 · 362 阅读 · 0 评论 -
2-5 Two Stacks In One Array (20分)(在一个数组中实现两个堆栈)
Write routines to implement two stacks using only one array. Your stack routines should not declare an overflow unless every slot in the array is used.Format of functions:Stack CreateStack( int MaxElements );int IsEmpty( Stack S, int Stacknum );int Is原创 2020-10-04 20:26:17 · 837 阅读 · 0 评论 -
2-8 符号配对 (20分)【栈的应用】
请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。输入格式:输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。输出格式:首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。输入样例1:void test(){ int i, A[10]; for (i=0;原创 2020-10-04 18:01:55 · 776 阅读 · 1 评论 -
2-2 学生成绩链表处理 (20分)
本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。函数接口定义:struct stud_node *createlist();struct stud_node *deletelist( struct stud_node *head, int min_score );函数createlist利用scanf从输入中获取学生的信息,将其组织成单向链表,并返回链表头指针。链表节点结构定义如下:struct stud_node { int原创 2020-10-04 17:52:58 · 152 阅读 · 0 评论 -
KMP 串的模式匹配 (25分)(3种方法)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:数据0:小规模字符串,测试基本正确性;数据1:随机数据,String 长度为 105,Pattern 长度为 10;数据2:随机数据,String 长度为 105,Pattern 长度为 102;数据3:随机原创 2020-10-02 22:01:40 · 1995 阅读 · 7 评论 -
2-4 另类堆栈 (20分)
在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满?函数接口定义:bool Push( Stack S, ElementType X );ElementType Pop( Stack S );其中Stack结构定义如下:typedef int Position;typedef struct SNode *PtrToSNode;struct SNode { ElementType *Data; /*原创 2020-10-01 11:37:09 · 218 阅读 · 0 评论 -
6-3 Add Two Polynomials (20分)(附测试点)
Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation with a dummy head node. Note: The zero polynomial is represented by an empty list with only the dummy head node.Format of functions:Polynomial Add( Polyno原创 2020-10-01 11:01:16 · 2617 阅读 · 2 评论 -
2-3 链表拼接 (20分)(注意C与C++的不同)
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:struct ListNode { int data; struct ListNode *next;};函数接口定义:struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);其中list1和list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回原创 2020-09-30 22:15:03 · 397 阅读 · 0 评论 -
【MOOC】03-树3 Tree Traversals Again (25分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(原创 2020-09-30 21:38:31 · 104 阅读 · 0 评论 -
1-4 列车厢调度 (25分)(不会做)
1 ====== <--移动方向 / 3 ===== \ 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧)。今天,我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图,问题描述如下:有三条平行的列车轨道(1、2、3)以及1-3和2-3两段连接轨道。现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要求的顺序转移到2号轨道。规则...原创 2020-09-26 20:59:03 · 279 阅读 · 0 评论 -
【MOOC】02-线性结构3 Reversing Linked List (25分)(两遍过)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.Input Specification:Each原创 2020-09-21 22:16:33 · 317 阅读 · 0 评论