[转]NYOJ-511-移动小球
http://acm.nyist.net/JudgeOnline/problem.php?pid=511
这道题很容易想到要构建一个循环链表来确定每个球的相对位置,就是操作比较繁琐,考虑情况较多。
首先要创建节点Node,每个节点都有一个初始顺序order,指向左边的Node*指针left,何指向右边的Node*指针right。
- struct Node
- {
- int order;
- Node *left,*right;
- }node[N];
然后给每个小球附上顺序,并建立和左右的联系。
- void build(int n)
- {
- int i,order=1;
- for(i=1;i<n;i++)
- {
- node[i].order=i;
- node[i].right=&node[i+1];
- node[i+1].left=&node[i];
- }
- node[1].left=&node[n];
- node[n].right=&node[1];
- node[n].order=n;
- }
然后就是A、B操作,下边叙述一下A操作(将x放在y左边)的实现方法:
1.将x左边节点的right指针指向x的右边节点
2.将x右边节点的left指针指向x的左边节点
3.将x的right指向y节点
4.将x的left指向y左边的节点
5.将y左边节点的right指向x节点
6.将y的left指向x节点
实现代码:
- void A(int x,int y)
- {
- Node *p=&node[x],*q=&node[y];
- p->left->right=p->right;
- p->right->left=p->left;
- p->left=q->left;
- p->right=q;
- q->left->right=p;
- q->left=p;
- }
由于交换位置仅改变节点的左右指针,并没有改变数组的下标(下标其实与order相同),所以查找球号时直接用下标索引。
同理可知操作B。
完整代码如下:
- #include<stdio.h>
- const int N=10005;
- struct Node
- {
- int order;
- Node *left,*right;
- }node[N];
- void build(int n)
- {
- int i,order=1;
- for(i=1;i<n;i++)
- {
- node[i].order=i;
- node[i].right=&node[i+1];
- node[i+1].left=&node[i];
- }
- node[1].left=&node[n];
- node[n].right=&node[1];
- node[n].order=n;
- }
- void A(int x,int y)
- {
- Node *p=&node[x],*q=&node[y];
- p->left->right=p->right;
- p->right->left=p->left;
- p->left=q->left;
- p->right=q;
- q->left->right=p;
- q->left=p;
- }
- void B(int x,int y)
- {
- Node *p=&node[x],*q=&node[y];
- p->left->right=p->right;
- p->right->left=p->left;
- p->right=q->right;
- q->right->left=p;
- p->left=q;
- q->right=p;
- }
- int main()
- {
- int ncase,n,m,i;
- char cmd;
- int x,y;
- scanf("%d",&ncase);
- while(ncase--)
- {
- scanf("%d%d",&n,&m);
- build(n);
- while(m--)
- {
- scanf("%*c%c%d%d",&cmd,&x,&y);
- switch(cmd)
- {
- case 'A':
- A(x,y);break;
- case 'B':
- B(x,y);break;
- case 'Q':
- printf("%d\n",x?node[y].right->order:node[y].left->order);break;
- }
- }
- }
- return 0;
- }
其实此题还可以不用链表,对比了一下,时间相差不大,相比而言非链表法更不容易出错。
思路基本一样,直接给出代码:
- #include<cstdio>
- const int N=10005;
- struct xyz
- {
- int prv,nxt;
- }a[N];
- void build(int n)
- {
- int i;
- for(i=1;i<=n;i++)
- {
- a[i].prv=i-1;
- a[i].nxt=i+1;
- }
- a[1].prv=n;
- a[n].nxt=1;
- }
- void A(int x,int y)
- {
- a[a[x].prv].nxt=a[x].nxt;
- a[a[x].nxt].prv=a[x].prv;
- a[x].nxt=y;
- a[x].prv=a[y].prv;
- a[a[y].prv].nxt=x;
- a[y].prv=x;
- }
- void B(int x,int y)
- {
- a[a[x].prv].nxt=a[x].nxt;
- a[a[x].nxt].prv=a[x].prv;
- a[x].nxt=a[y].nxt;
- a[x].prv=y;
- a[a[y].nxt].prv=x;
- a[y].nxt=x;
- }
- int main()
- {
- int ncase,n,m,i;
- char cmd;
- int x,y;
- scanf("%d",&ncase);
- while(ncase--)
- {
- scanf("%d%d",&n,&m);
- build(n);
- while(m--)
- {
- scanf("%*c%c%d%d",&cmd,&x,&y);
- switch(cmd)
- {
- case 'A':
- A(x,y);break;
- case 'B':
- B(x,y);break;
- case 'Q':
- printf("%d\n",x?a[y].nxt:a[y].prv);break;
- }
- }
- }
- return 0;
- }
[转]NYOJ-511-移动小球的更多相关文章
- leetcode排列,求第k个排列
stl 中的下一个排列在写一遍忘了 写个1个多小时,使用递归写的,错误就在我使用一个list保存当前剩下的数,然后利用k/(n-1)!的阶乘就是删除的数字,但进过观察, 比如 list={1,2,3} ...
- NYOJ 1007
在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...
- NYOJ 998
这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...
- 【webGl】threejs实现一个简单的动画-弹跳的小球
在这里,我们将动态画面简称为动画(animation).正如动画片的原理一样,动画的本质是利用了人眼的视觉暂留特性,快速地变换画面,从而产生物体在运动的假象.而对于Three.js程序而言,动画的实现 ...
- HTML5 Canvas彩色小球碰撞运动特效
脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效. 效果展示 http://hovertree.com/texiao/html5/39/ ...
- 纯CSS3实现3D跳动小球
请使用Chrome,火狐的浏览器查看本页面,使用IE将看不到效果.如果在本页看不到一个跳动的小球,请确定您的浏览器支持CSS3,或者访问http://keleyi.com/a/bjac/iphgrtq ...
- HTML5 随机弹跳的小球
查看效果:http://keleyi.com/a/bjad/tc1y11dy.htm Chrome效果图: 火狐效果图:推荐:http://hovertree.com/texiao/css3/18/ ...
- NYOJ 333
http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...
- WPF实现物理效果 拉一个小球
一直以来都对物理效果有神秘感,完全不知道怎么实现的.直到看到了周银辉在老早前写的一篇博客:http://www.cnblogs.com/zhouyinhui/archive/2007/06/23/79 ...
随机推荐
- django-admin引用百度地图
实现的功能有,某个地点对应的经纬度自动填上,如果有经纬度的话,自动显示对应经纬度的地点,密匙在去百度地图引用搜索 <script type="text/javascript" ...
- HTML5(。。。。不完整)
<!DOCTYPE html> 不区分大小写 <header>.<nav>.<article>.<section>.<sidebar ...
- WEB-INF有关的目录路径总结、转向方式: forward 重定向方式: Redirect
WEB-INF有关的目录路径总结 1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提 ...
- FAT和EXFAT文件系统
文件系统 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.在移动存储设备上比较常用的有FAT文件系统和ExFAT文件系统. FAT分区依据FAT表中每个簇链的所 ...
- h => h(App)解析
在创建Vue实例时经常看见render: h => h(App)的语句,现做出如下解析: h即为createElement,将h作为createElement的别名是Vue生态系统的通用管理,也 ...
- ACM训练小结-2018年6月16日
今天题目情况如下:A题:线段树+XOR性质.情况:由于写法问题,调试困难,浪费大量时间.B题:(对所有满足i mod p==q,求a[i]之和),无修改,直接上n*sqrt(n)的分块写法.情况:由于 ...
- java基础之常量与变量
概要:通过这段时间的工作,发现自己的基础还是很薄弱的,so,you know 常量 一种特殊的变量,程序运行过程中不能改变的值 语法格式:final 数据类型 常量名称 = 常量值 例子:fina i ...
- Android LCD(三):LCD接口篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/9177085 关键词:Android LCD控制器 Framebuffer PWM 平 ...
- avaweb学习总结(八)——HttpServletResponse对象(二)
一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- Eclipse开发快捷键精选
1.alt+?或alt+/:自动补全代码或者提示代码2.ctrl+o:快速outline视图3.ctrl+shift+r:打开资源列表4.ctrl+shift+f:格式化代码5.ctrl+e:快速转换 ...