移动盒子UVa 12657

你有一行盒子,从左到右依次编号为1,2,3,…,n。可以执行以下4种指令:

1 x y:表示把盒子x移动到盒子y的左边(如果x已经在y的左边则忽略此指令)。
2 x y:表示把盒子x移动到盒子y的右边(如果x已经在y的右边则忽略此指令)。
3 x y:表示交换盒子x和y的位置。
4:表示反转整条链。

指令保证合法,即x不等于y。

例如当n=6时在初始状态盒子序列为为:1 2 3 4 5 6;
执行1 1 4后,盒子序列为:2 3 1 4 5 6;
接下来执行2 3 5,盒子序列变为:2 1 4 5 3 6;
再执行3 1 6,盒子序列变为:2 6 4 5 3 1;
最终执行4,盒子序列变为:1 3 5 4 6 2。

【输入格式】
输入包含不超过10组数据,每组数据第一行为盒子数n和指令m,以下m行每行包含一条指令。
【输出格式】
每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。
【输入样例】
6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4
【输出样例】
12
9

没有用C语言写,太麻烦了。

这里直接使用list容器进行模拟。(由于C++是自学的,容器也不咋会用,回头补补知识)

代码模拟:

//移动盒子——链表实现
//dacao
//2018/10/29
#include<iostream>
#include<list>
using namespace std;int main()
{int n,m;int op,x,y;int i;while(cin>>n>>m){list<int> box;list<int>::iterator it,itx,ity;for(i=1;i<=n;i++)box.push_back(i);while(m--){cin>>op;if(op==4){box.reverse();continue;}cin>>x>>y;for(it=box.begin();it!=box.end();it++){if(*it==x)itx=it;if(*it==y)ity=it; }if(op==1){box.insert(ity,*itx);box.erase(itx);}if(op==2){box.insert(++ity,*itx);box.erase(itx);}if(op==3){box.insert(ity,*itx);box.insert(itx,*ity);box.erase(itx);box.erase(ity);}    }   int sum=0;it=box.begin();for(i=1;i<=n;i++){if(i%2==1)sum+=*it;it++;}cout<<sum<<endl; }return 0;
}

当然,这样写的结果会超时,答案是用数组来代替双向链表,且处理很有技巧uva12657 移动盒子

链接中,有一行代码看不懂~

想不通:if(p == 3 && right[y] == x) swap(x, y);

代码来自:https://blog.csdn.net/laddie132/article/details/48289137?utm_source=blogxgwz7

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define MAXL 100010int right[MAXL], left[MAXL];inline void link(int l, int r) {right[l] = r;left[r] = l;
}int main() {
//  freopen("input.txt","r",stdin);int n, m, cases = 1;while(scanf("%d%d", &n, &m) != EOF) {int i, sta = 0;right[n] = 0;left[0] = n;for(i = 0; i < n; i++) {link(i, i+1);}for(i = 1; i <= m; i++) {int p, x, y;scanf("%d", &p);if(p == 4) sta = !sta;else{scanf("%d%d", &x, &y);if(p == 3 && right[y] == x) swap(x, y);if(sta && (p == 1 || p == 2)) p = 3 - p;if(p == 1 && right[x] == y) continue;if(p == 2 && right[y] == x) continue;}int lx = left[x], rx = right[x], ly = left[y], ry = right[y];switch (p) {case 1 : {link(lx, rx);link(ly, x);link(x, y);break;}case 2 : {link(lx, rx);link(x, ry);link(y, x);break;}case 3 : {link(lx, y);link(x, ry);if(rx == y) link(y, x);else{link(y, rx);link(ly, x);} break;}default : break;}}long long ans = 0;int b = 0;for(i = 1; i <= n; i++) {b = right[b];if(i % 2 == 1) ans += b;}  if(sta && n % 2 == 0) ans = (long long)n * (n + 1) / 2 - ans;printf("Case %d: %lld\n", cases++, ans);}return 0;
}

移动盒子——双向链表相关推荐

  1. 例题6-5 移动盒子(Boxes in a Line, UVa 12657)

    例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...

  2. UVa 12657 - Boxes in a Line ( 双向链表 )

    题意 你有一行盒子,从左到右依次编号为1, 2, 3,-, n.可以执行以下4种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令). 2 X Y表示把盒子X移动到盒子Y ...

  3. Boxes in a Line UVA - 12657 (双向链表)

    题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m  代表有n个盒子 每个盒子最开始按1~n排成一行  m个操作, 1 x y  :把盒子x放到y ...

  4. Uva 12657 Boxes in a Line 双向链表

    操作4比较特殊,为了避免一次性修改所有元素的指针,由于题目只要求输出奇数盒子的编号,所以我们可以灵活的根据是否进行过操作4对操作1 操作2 进行改动 操作3不受操作4影响 上代码.... #inclu ...

  5. 【UVA 12657】移动盒子 Boxes in a Line

    [UVA 12657]移动盒子 Boxes in a Line 洛谷题目地址 [题意] 一行有n 个盒子,从左到右编号为1-n.模拟以下4种命令. 1 X Y :将盒子X 移动到Y 的左侧(如果X 已 ...

  6. uva12657 移动盒子

    你有一行盒子,从左到右依次编号为1,2,3,-,n.可以执行以下4种指令: 1 x y:表示把盒子x移动到盒子y的左边(如果x已经在y的左边则忽略此指令). 2 x y:表示把盒子x移动到盒子y的右边 ...

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

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

  8. HarmonyOS UI开发 AdaptiveBoxLayout(自适应盒子布局) 的使用

    AdaptiveBoxLayout 是什么 AdaptiveBoxLayout 是自适应盒子布局,该布局提供了在不同屏幕尺寸设备上的自适应布局能力,主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自 ...

  9. 创建一个水平盒子java_盒子模型理解

    HTML CSS + DIV实现整体布局 1.技术目标: 开发符合W3C标准的Web页面 理解盒子模型 实现DIV+CSS整体布局 2.什么是W3C标准? W3C:World Wide Web Con ...

最新文章

  1. WindowsServer2012史记7-茴香豆的五种写法和四种”显示计算机”的方法
  2. 设计师学习HTML/CSS之路-01
  3. Linux state 方式 安装nginx 服务
  4. 汇编学习心得(二)关于字符的处理
  5. 七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)
  6. java final 修改_“无法改变的设计”——浅谈Java中的final关键字
  7. ASP.NET 安全性
  8. [ActionScript 3.0] AS3.0 对象在一定范围随机显示不重叠
  9. Mac os装软件时提示显示需要安装旧Java SE 6运行环境解决办法
  10. 骁龙855加持!OPPO Reno正面照揭晓:边框窄得吓人
  11. Python的基本语法汇总
  12. 开学了,一切都要开始了!
  13. ubuntu服务器开放端口_Docker服务开放了这个端口,服务器分分钟变肉机
  14. Linux 安装JDK详细步骤
  15. 标签打印软件如何批量打印可变内容
  16. 广告法违禁词替换工具_广告法禁用词替代大全之第一弹
  17. Matlab中矩阵的右上角有一撇表示什么意思
  18. poi导出excel 损坏_Java使用POI生成Excel文件后打不开的问题
  19. python三个箭头怎么打出来_(Python3)Linux和Windows箭头键按下
  20. vue组件通讯六种方法。

热门文章

  1. PMSM滑模观测器无感控制
  2. protel99常用元件的电气图形符号和封装形式
  3. VSCode - setting.json配置 - Prettier、Vetur格式化和ESLint检查
  4. Esxi虚拟系统中虚拟机docker桥接网络
  5. 电容器的基础知识(1)
  6. 最早解决制约计算机汉字输入,摆脱键盘束缚 计算机时代的汉字情结
  7. 基于ABP vNext 4.X(.Net 5)的Blazor项目创建及配置
  8. 中国全球导航卫星系统定位系统市场趋势报告、技术动态创新及市场预测
  9. 并查集 rank+路径压缩
  10. 计算机网络的工作原理演示动画,动画演示14种流量计的工作原理