还是这个样例

之前提到,将321放在45的上面,就要对3.next -> 4,2.next -> 3,1.next -> 2全部重新设置一遍,也就是要操作3次。

既然顺序是一定的,换个角度想,为什么不把45放在321上面呢?这样,只需要设置4.next -> 3,5.next -> 4两次就完成了,因为2<3,这样做可以实现一定程度上更速。

也就是说,我们每次读入x和y之后,首先要对box[x][0]和box[y][0]比较一次大小,然后总是把小的那一堆放在大的那一堆上面就行了。这个就是思路三的优化版本。


思路四——思路三plus版本

我还是考虑用二维数组+结构体来做。

这次的结构体有一点不同,见下面的代码。

struct artical
{int link1=0,link2=0;
};

刚开始的时候,我想用next指向下一个数据,previous指向上一个数据,如果拘泥于这样的想法就不免写出局促的代码。在这个优化版本中,我把next和previous改为link1和link2,它们是artical的两根“链条”,这样我就不需要再考虑artical之间的先后关系,只要它们是“串在一起”的就行了。而且这样设置结构体,不管是移动物品还是输出物品都更加简洁好写。

具体的操作流程是这样的:当一个物品要和另一个物品产生连接时,优先调用link1;如果link1已经被用过了,再调用link2。

具体的输出流程是这样的:从这个box的顶部开始输出,然后更新顶部元素,继续输出顶部,直至输出结束。


代码部分

初始化箱子

int box[n+1][3];
for (int i=1;i<=n;i++) {box[i][0] = 1;box[i][1] = i;  //顶 box[i][2] = i;  //底 }

我debug了一个上午,仅仅是因为上述代码中第一行写成了

int box[n][3];

少开了一组空间,结果屡屡出错。

如果你也遇到了同样的程序+同样的输入+多次执行=不同的结果,建议检查①指针未初始化 ②数组或字符串开的太小。

对每一组输入的x和y,只要对其顶部元素建立链接就足够了!

int x,y;
scanf("%d %d",&x,&y);//连接x顶和y顶的物品
if ( box[x][0] && box[y][0] ) {//如果link1还没被调用,则优先调用link1 if ( a[ box[x][1] ].link1==0 ) {a[ box[x][1] ].link1 = box[y][1];}//否则link1已经被调用过了,调用link2 else {a[ box[x][1] ].link2 = box[y][1];}//y顶的物品也要产生链接if ( a[ box[y][1] ].link1==0 ) {a[ box[y][1] ].link1 = box[x][1];}else {a[ box[y][1] ].link2 = box[x][1];}}

不要忘记更新x的顶部元素、底部元素,y的顶部元素、底部元素,x的元素数量,y的元素数量,这些建议自己操作一下,虽然不难,总归还是有一点细节在的。

最后输出。


完整代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct artical
{int link1=0,link2=0;
};
artical a[N];int main(){int n,m;scanf("%d %d",&n,&m);int box[n+1][3];for (int i=1;i<=n;i++) {box[i][0] = 1;box[i][1] = i;  //顶 box[i][2] = i;  //底 }for (int i=0;i<m;i++) {int x,y;scanf("%d %d",&x,&y);//连接x顶和y顶的物品 if ( box[x][0] && box[y][0] ) {//如果link1还没被调用,则优先调用link1 if ( a[ box[x][1] ].link1==0 ) {a[ box[x][1] ].link1 = box[y][1];}//否则link1已经被调用过了,调用link2 else {a[ box[x][1] ].link2 = box[y][1];}//y顶的物品也要产生链接if ( a[ box[y][1] ].link1==0 ) {a[ box[y][1] ].link1 = box[x][1];}else {a[ box[y][1] ].link2 = box[x][1];}}//更新x顶、x底、y顶、y底的物品if ( box[y][0]==0 ) {box[y][2] = box[x][1]; }if ( box[x][0] ) {box[y][1] = box[x][2];}box[x][1] = 0;box[x][2] = 0;//更新x、y的物品数量box[y][0] = box[x][0] + box[y][0];box[x][0] = 0; }//输出for (int i=1;i<=n;i++) {printf("%d",box[i][0]);if ( box[i][0] ) {//输出顶部物品 printf(" %d",box[i][1]);//更新顶部物品 int front = box[i][1];box[i][1] = a[ box[i][1] ].link1;while ( box[i][1] ) {printf(" %d",box[i][1]);//如果link1是上一个物品,则调用link2 if (front == a[ box[i][1] ].link1) {front = box[i][1];box[i][1] = a[ box[i][1] ].link2;}//否则link2是上一个物品,调用link1 else {front = box[i][1];box[i][1] = a[ box[i][1] ].link1;}}} printf("\n");} return 0;
}

查寝 | c++ | 不用双向链表(下篇)相关推荐

  1. 查寝 | c++ | 不用双向链表(上篇)

    一.题目描述 小军的军训进行到了一半了,今天军训教官搞了一波突然袭击,进行了一个寝的查. 提前了解到查寝消息的小军准备进行一波整理归纳,来使自己的寝室变得更加整洁.具体来说,小军有 n 件物品,放在 ...

  2. 提交日期表单状态操作_奇怪的知识又增加了,表单还能查寝?

    Hi,胖友们,大家好!好久不见呀,最近表姐在刷微博时,无意间发现一位小伙伴神奇的表单用法. 别人都用表单收集数据,登记信息,而这位小伙伴则是用表单来"查寝",看了他的讲解,表姐不禁 ...

  3. 【BIT2021程设】20.军训日记:查寝

    写在前面: 本系列博客仅作为本人十一假期过于无聊的产物,对小学期的程序设计作业进行一个总结式的回顾,如果将来有BIT的学弟学妹们在百度搜思路时翻到了这一条博客,也希望它能对你产生一点帮助(当然,依经验 ...

  4. 20. 军训日记:查寝

    小军的军训进行到了一半了,今天军训教官搞了一波突然袭击,进行了一个寝的查. 提前了解到查寝消息的小军准备进行一波整理归纳,来使自己的寝室变得更加整洁.具体来说,小军有n件物品,放在n个盒子里,第i个盒 ...

  5. 高校“花式查寝”到底多有意思?

    滴--您有一条新的消息 今晚查寝. 收到. 你,经历过查寝吗? 辅导员推门问候,查人查锅查卫生 查寝变成我们大学寝室生活的"家常便饭"后 还衍生出了一些"奇奇怪怪&quo ...

  6. 【毕业设计源码】基于微信小程序的查寝系统的设计与实现

    目录 一.程序介绍: 三.文档目录: 四.运行截图: 五.数据库表: 六.代码展示: 七.更多学习目录: 八.互动留言 一.程序介绍: 文档:开发技术文档.参考LW.答辩PPT,部分项目另有其他文档 ...

  7. 辽宁师范大学计算机学院查寝吗,辽宁师范大学影视艺术学院

    影视艺术学院研究生会章程 辽宁师范大学影视艺术学院研究生会以促进研究生的全面发展为宗旨,以服务全体研究生为己任.通过组织各种活动推进校园民主与校园文化建设,营造良好校园文化氛围和学术氛围,树立一种蓬勃 ...

  8. 学校校园学生寝室管理查寝打分系统 毕业设计毕设源码毕业论文开题报告参考(1)功能概要

    该系统主要分网站管理员.班主任.任课老师.学生这几个角色 网站管理员 学校设置 学校概要:设置学校简介.学校机构.学校领导.校园风景.联系我们 分院设置:录入分院信息.分院列表.分院信息修改和删除 广 ...

  9. OSChina 周二乱弹 ——查寝大妈,你写我在床上硬不起来是怎么回事!

    2019独角兽企业重金招聘Python工程师标准>>> @xuhuazi : first blood~ 动弹,你好. 你送一血,我送你首歌吧~ 派对动物 - 五月天 手机党少年们想听 ...

最新文章

  1. 解题报告 『生活大爆炸版石头剪刀布(模拟)』
  2. NYOJ 76 超级台阶
  3. Boost:序列化之text_iarchive和text_oarchive
  4. Theano mnist数据集格式
  5. 程序运行实例数量的控制
  6. 【主题演讲】探讨视频行业与技术的更多挑战与机会
  7. 【转】php利用mkdir创建多级目录
  8. html5 css3考试f卷,HTML5 CSS3 JavaScriptWeb前端开发自测试卷3.docx
  9. Ubuntu 下安装AMBER10/AmberTools 1.2
  10. Flutter 雷达扫描效果、Flutter旋转扫描
  11. 九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解...
  12. 【androidjniNDk】详细介绍每一步,让你轻松掌握android JNI NDk
  13. 二分法08:寻找旋转排序数组中的最小值
  14. 【布局优化】基于人工鱼群算法实现充电桩布局优化matlab源码
  15. 华中科技大计算机第八次基础作业,华中科技大计算机基础第三次作业.doc
  16. 那些年,我们一起踩过的 “Android 坑”
  17. 木马的远程控制和清除 实验
  18. 汉诺塔游戏玩法介绍(攻略和编程实现)
  19. .NET网页显示饼形图
  20. serverlet 区别_jsp serverlet 区别

热门文章

  1. txt 文件导入Excel
  2. Win11 PowerShell字体大小设置
  3. VMware 安装Rocky9.0
  4. 十大3D立体游戏强烈推荐
  5. 编解码器之战:AV1、HEVC、VP9和VVC 1
  6. 使用C# 创建PDF
  7. 2021年施工员-市政方向-通用基础(施工员)考试及施工员-市政方向-通用基础(施工员)复审考试
  8. 锐捷SNMP配置实例
  9. 服务器被入侵怎么办?看我操作!
  10. JAVA 实现微信公众号的生成带参数二维码和扫码后被动回复消息