![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
第6章 数据结构基础
紫书第六章例题与习题
徹夜禁止
日拱一卒,功不唐捐
展开
-
例题6-17 UVa10562-Undraw the Trees
将每次的输入全部读取到二维数组中,在第一行找到根结点开始进行先序遍历即可。注意括号的输出和换行符。题目链接:UVa 10562AC代码:#include <iostream>#include <set>#include <cstring>using namespace std;//#define DEBUG//#ifdef DEBUG//#include <fstream>//#define cout out//ofstream out(原创 2020-05-18 17:42:15 · 145 阅读 · 1 评论 -
例题6-16 UVa10129-Play On Word(欧拉道路)
把每个单词的首位两个字母看做一条边的两个顶点,这样就可以把图建起来了。之后先深搜看看这个图是不是连通图,不是的话不存在欧拉道路。之后判断每个顶点的出度入度是否相同,如果不相同的点超过两个,也不存在欧拉道路。如果所有点的出度入度都相同,或者不相同的两个点恰好可以作为起点和终点,则存在欧拉道路。我是用邻接表实现的。题目链接:UVa 10129AC代码:#include <iostream>#include <list>#include <set>using nam原创 2020-05-18 15:45:46 · 164 阅读 · 0 评论 -
例题 6-15 UVa10305-Ordering Tasks(拓扑序列)
第一次接触到的拓扑序列的题。尝试了邻接表和邻接矩阵+深搜两种写法,后者是紫书的方法。邻接表的方法是考察每个点的入度,邻接矩阵的方法是通过深搜找到每条路径的终点,将它比喻为结果的话,它的父结点就是它的依附条件,同理推下去,每次深搜得到的点都应该放在当前拓扑序列的队首。题目链接:UVa 10305AC代码:邻接表解法:#include <iostream>#include <list>#include <queue>using namespace std;c原创 2020-05-18 00:24:03 · 141 阅读 · 0 评论 -
例题6-14 UVa816-Abbott的复仇(BFS)
BFS的题目,值得学习的地方是灵活地使用数组来表示结点的各种状态,以及将定长的字符串转换成对应的数字以方便使用。先记录一点。题目链接:UVa 816AC代码:#include <iostream>#include <cstring>#include <queue>using namespace std;const char* dirs = "NESW";const char* turns原创 2020-05-17 22:17:26 · 245 阅读 · 0 评论 -
例题6-13 UVa1103-Ancient Messages(DFS)
算是很复杂的题了(起码对我来说)。彻底弄懂之后梳理一下解法步骤吧:把十六进制的输入转成二进制保存。在保存的图像外圈新增一个白圈。这样做是为了把符号处在图像边缘时切割开的白色部分全部连在一起,以便于之后着色。实际操作时我是在存放的时候就留出了左侧和上方的空间,然后在深搜的时候把四个方向的空行全部加上,间接加了白圈。外层的白色全部着色后,剩余的白色就只剩下符号内部的白洞了。这时对每个符号分别进行深搜,把黑色块换成新的颜色,遇到白色块时把与这个白色块连通的白色块全部着成同种颜色,同时计数器加一,表示有一个原创 2020-05-17 16:13:09 · 121 阅读 · 0 评论 -
例题6-12 UVa572-Oil Deposits(二重循环确定八个方向)
这道题值得记录的点是使用二重循环确定八个方向,通过和-1,0,1的配合实现从一个点向八个方向辐射,很聪明的做法。题目链接:UVa 572AC代码:#include <iostream>#include <cstring>//#include <fstream>using namespace std;const int maxn = 1000;int m,n,flag[maxn][maxn];//标记当前点是否被访问过char vex[maxn][max原创 2020-05-16 16:43:56 · 118 阅读 · 0 评论 -
例题6-11 UVa297-Quadtrees(不同于紫书的解法,基于指针的树实现)
第一次遇到四叉树的题目。紫书上相当于创建了32×32的二维数组来模拟整个大方块。而我的思路是:仿照建二叉树的方法建四叉树,只是多了两个子节点而已。分别用-1,0,1来表示当前节点的颜色,以便于合并以及计数。合并的细节我写到了注释里。计数时,将根结点(即最外层的大方块)看做拥有32×32=1024个像素点,那么第二层中,每个结点拥有1024/(2^2)个结点,以此类推。题目链接:[UVa 297](https://onlinejudge.org/index.php?option=com_onlinejud原创 2020-05-15 15:35:08 · 183 阅读 · 0 评论 -
例题6-10 UVa699-The Falling Leaves(指针建树版)
这道题就比较简单了,借助足够大的数组保存每个位置的值得总和就好。其实做完之后感觉建树反而显得冗余,因为我的代码是边读入边判断的,树结构其实没有实际的用处,只是在计算总和时顺便建好的,所以不建树可能是更好的方法(参照紫书)。当然如果是建好树后再遍历求结果的话树结构是有用的,但是很显然会复杂很多。题目链接:UVa 699AC代码:#include <iostream>#include <cstring>//#include <fstream>using names原创 2020-05-15 11:03:22 · 96 阅读 · 0 评论 -
例题6-9 UVa839-Not so Mobile
依然还是尝试使用基于指针的树来解决,本来已经过了uDebug,但还是遇到了无限RE。第一次RE后,换到Dev c++进行调试,发现是旧标准下内存申请的问题(具体原因我也讲不清),缝缝补补终于调到Dev c++也没问题后继续submit,但还是RE。最终也没找到问题。但还是记录下代码。题目链接:UVa 839修改得面目全非的RE代码:#include <iostream>//#include <fstream>using namespace std;struct Node原创 2020-05-15 00:11:33 · 92 阅读 · 0 评论 -
例题6-8 UVa548-Tree(DFS,使用基于指针的树实现)
树的深度优先遍历,紫书上给出的是数组的实现方式。我又写了一遍基于指针的树,思路借鉴了紫书,权当练习了。题目链接:UVa 548AC代码:#include <iostream>#include <sstream>#include <vector>//#include <fstream>using namespace std;vector<int> in_order, post_order;int best, best_sum;原创 2020-05-14 21:41:12 · 112 阅读 · 0 评论 -
例题6-7 Uva122-Trees on the level(BFS)
树的广度优先遍历,很基础的题目。要注意的是如何从输入流中获取需要的数据。题目链接:UVa 122AC代码:#include <iostream>#include <fstream>#include <cstring> #include <vector>#include <queue>using namespace std;const int maxn = 1000;struct Node { bool have_value;原创 2020-05-14 21:36:28 · 97 阅读 · 0 评论 -
例题6-6 UVa679-Dropping Balls(满二叉树、递归)
这题解法同样很多,紫书上直接模拟最后一颗小球的做法很妙,在此就不再赘述。想记录的方法是递归解法。列出前四层每个小球的落点,以第2和第3层为例:第二层是2,3;第三层是4,6,5,7;不难注意到,4,6分别是22与32,而5,7分别是22+1与32+1;在其他层里也可以找到这样的规律,所以可以使用以下的递归解法。题目链接:UVa 679AC代码:#include <iostream>#include <cmath>using namespace std;int tree原创 2020-05-14 00:14:57 · 129 阅读 · 0 评论 -
例题6-5 UVa12657-Boxes in a Line(不同于紫书的解法)
这道题很明显是双向链表了,因为要知道上一个盒子的位置。所以可以使用list库。但仅仅如此的话定位某个data还是需要从头查找,很浪费时间,而我也确实因此TLE了。后来看到别人使用vector保存对应data的指针,这样可以直接读取。但使用后还是TLE。怀疑是使用reverse翻转时浪费了时间。最终借用了紫书的inv标记,终于AC。题目链接:UVa 12657AC代码:#include <iostream>//#include <fstream>#include <ve原创 2020-05-13 23:11:10 · 125 阅读 · 0 评论 -
例题6-4 UVa11988-Broken Keyboard (a.k.a. Beiju Text)(用不同于紫书的两种办法解决!)
这道题目紫书上给出的解法是使用数组模拟链表,个人认为不大好理解。所以尝试了新的办法:栈+双向队列以及双向链表。具体的细节都在注释里给出。其实还想用单向链表实现一下,等明天有时间再写吧。题目链接:UVa 11988AC代码①:双向链表#include <iostream>#include <list>using namespace std;int main() { string s; while (cin >> s) { list<char>原创 2020-05-12 23:22:51 · 169 阅读 · 0 评论 -
例题6-3 UVa442-Matrix Chain Multiplication
这道题让我想起去年学数据结构时候做过的实验题:虽然说难度不同,要实现的目的也不同,但是思路上是完全一致的:把要参与运算的元素和符号分离开来,当触发某一条件时进行运算并对栈进行处理。这道题除了"(“和”)"外没有其他的运算符,所以只创建一个栈。题目链接:UVa 442AC代码:#include <iostream>#include <stack>#include <map>//#include <fstream>using namespace原创 2020-05-11 19:12:07 · 150 阅读 · 0 评论 -
例题6-2 UVa514-Rails
很简单的模拟题,也是学到栈时很经典的填空题。按照做题时的思路一步步写下来就好了。在uDebug时发现最后还要多输出一个空行,算是易错点吧。题目链接:UVa 514AC代码:#include <iostream>//#include <fstream>#include <stack>using namespace std;const int maxn = 2000;int main() { int T, N, count = 0; //ofstream原创 2020-05-11 17:47:03 · 116 阅读 · 0 评论