NYOJ-511-移动小球
来源:互联网 发布:linux tail 最后一页 编辑:程序博客网 时间:2024/03/29 22:22
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;
- }
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;
- }
同理可知操作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 移动小球
- NYOJ 511 移动小球
- NYOJ-511-移动小球
- NYOJ 511 移动小球
- NYOJ-511 移动小球【模拟】
- NYOJ 511 - 移动小球 链表版
- nyoj 551 移动小球
- NYOJ 551 移动小球
- NYOJ-移动小球
- nyoj 511 移动小球(链表的简单使用)
- NYOJ 题目511 移动小球(双向循环链表)
- 移动小球
- 移动小球
- 移动小球
- 移动小球
- 移动小球
- 移动小球
- sicily 1934移动小球
- hdu 3911
- vi编辑器的使用
- head first--------------state pattern
- php支持json
- Struts2中OGNL,valueStack,stackContext的学习
- NYOJ-511-移动小球
- php支持json2
- python成长日记2:文件的输入输出
- 《算法竞赛入门经典》第四章小结
- 需要懂得的java专业名词
- Sicily 1344. 数列
- 重新做回菜鸟,初次使用wine
- Design Patterns in Java
- yum和apt-get用法及区别 (转)