链表问题1
来源:互联网 发布:网络的好处英语作文 编辑:程序博客网 时间:2024/06/02 07:01
有一些小球,从左到右依次编号1,2,3….n,执行两种指令。A X Y 表示把小球X移动到Y左边,B X Y 表示把小球X移动到Y的右边,保证指令合法,即X不等于Y。
分析:
1.用数组做也可以,但是如果反复执行B 1 n和A 1 2,则每次都移动几乎所有元素。
2.用链表做,强调相对顺序而非绝对顺序,可以用left[i]和right[i]分别表示左边和右边的小球编号(如果是0,表示不存在)。即使想象还有一个编号为0的小球(最后小球指向0就是循环链表),一切都不会有问题。
#include<iostream>#include<cstdio>#include<cstdlib>using std::cin;using std::cout;using std::endl;const int maxn=500000 + 50; int left[maxn],right[maxn],n,t; void link(int a,int b){ right[a]=b; left[b]=a;} int main(){ cin >> n; for(int i=1;i<=n;i++) { left[i]=i-1; right[i]=i+1;} right[n]=0; cin >> t; for(int i=1;i<=t;i++){ int X,Y; char c; c=getchar(); while(c!='A'&&c!='B') c=getchar(); cin >> X >> Y; link(left[X],right[X]); if(c=='B'){ //X .. Y-> .. Y X right[Y] link(X,right[Y]); link(Y,X); } else {//A //X .. Y -> .. X Y link(left[Y],X); link(X,Y); } } int head; for(head=1;head<=n&&left[head]!=0;head++); cout << head<<" "; while(right[head]!=0){ head=right[head]; cout << head<<" "; } cout << endl; return 0;}
0 0
- 链表问题1
- 链表问题
- 链表问题
- 链表问题
- C 链表问题
- 链表相交问题
- 链表问题
- 链表相交问题
- 链表问题总结
- 链表问题
- 链表相交问题
- 链表相交问题
- 链表问题
- 链表相交问题
- 循环链表问题
- 链表问题
- 链表排序问题
- 链表问题
- 简单了解OpenMP
- DIY个人智能家庭网关—— python篇之获取手机WIFI连接(上线/下线)状态
- 图解VMware下RedHat5.4安装
- ZOJ3605-Find the Marble
- openMP 嵌套循环
- 链表问题1
- 利用R语言的DMwR包处理样本不平衡
- 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问
- K-means聚类
- MySql与workbench中文乱码问题
- openssl——sha256算法源码
- java:递归实现输出目录下所有的文件(列出目录下所有的文件)
- CSS盒子模型
- 大顶堆