[UOJ #152][UR #10A]汉诺塔(构造+归并排序)
来源:互联网 发布:云计算机房维护 编辑:程序博客网 时间:2024/06/07 23:26
题目描述
传送门
题解
这是一道构造题,目标是排序可以用归并排序来解。
按照归并排序的方法做就行了,但是要注意一些细节:
1、每次归并排序的时候都要保证序列是原来的顺序,所以不能直接挪,而要用另一个柱子来当中转站。
2、每次递归完成之后要将所有的盘子挪到刚开始放的地方。这一步也需要用一个中转站。
即不能破环归并排序本身的性质,挪的过程中注意中转站的运用即可。
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int max_n=1e4+5;int n,a[max_n],b[max_n],num;struct hp{int x,y;}step[1000005];inline void mergesort(int l,int r,int from,int now){ int mid=(l+r)>>1; if (l==r) return; int nxt,other; if (now==1) { nxt=2; other=3; for (int i=l;i<=mid;++i) step[++num].x=1,step[num].y=3; for (int i=l;i<=mid;++i) step[++num].x=3,step[num].y=2; } else if (now==2) { nxt=1; other=3; for (int i=l;i<=mid;++i) step[++num].x=2,step[num].y=3; for (int i=l;i<=mid;++i) step[++num].x=3,step[num].y=1; } else if (now==3) { nxt=1; other=2; for (int i=l;i<=mid;++i) step[++num].x=3,step[num].y=2; for (int i=l;i<=mid;++i) step[++num].x=2,step[num].y=1; } mergesort(l,mid,nxt,nxt); mergesort(mid+1,r,now,now); int i=l,j=mid+1,k=l; while (i<=mid&&j<=r) { if (a[i]<=a[j]) { b[k++]=a[i++]; step[++num].x=nxt; step[num].y=other; } else { b[k++]=a[j++]; step[++num].x=now; step[num].y=other; } } while (i<=mid) { b[k++]=a[i++]; step[++num].x=nxt; step[num].y=other; } while (j<=r) { b[k++]=a[j++]; step[++num].x=now; step[num].y=other; } for (int i=l;i<=r;++i) { step[++num].x=other; step[num].y=from; } for (int i=l;i<=r;++i) a[i]=b[i];}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]); mergesort(1,n,1,1); printf("%d\n",num); for (int i=1;i<=num;++i) printf("%d %d\n",step[i].x,step[i].y);}
0 0
- [UOJ #152][UR #10A]汉诺塔(构造+归并排序)
- uoj #152. 【UR #10】汉诺塔
- UOJ #134(【UR #9】App 管理器-tarjen+构造)
- [UOJ#74][UR #6]破解密码(数学相关)
- [构造 随机 生成树计数] UOJ #75 【UR #6】智商锁
- UOJ 22 [UR #1]外星人
- 【UR #10】汉诺塔 题解
- UOJ#192. 【UR #14】最强跳蚤
- UOJ #31. 【UR #2】猪猪侠再战括号序列
- UOJ #74. 【UR #6】破解密码
- UOJ #60. 【UR #5】怎样提高智商
- UOJ #82. 【UR #7】水题生成器
- UOJ #118. 【UR #8】赴京赶考
- UOJ 225 [UR #15]奥林匹克五子棋
- UOJ 133 [UR #9]电路手动分析
- UOJ #242. 【UR #16】破坏蛋糕
- UOJ 21 [UR #1]缩进优化
- UOJ 31 [UR #2]猪猪侠再战括号序列
- 计算机外部设备功能
- Java代码实现依赖注入
- 控制反转(IoC)与依赖注入(DI)
- Math Summary
- xcode project setting
- [UOJ #152][UR #10A]汉诺塔(构造+归并排序)
- 正确安装配置Eclipse+VirtualBox+Genymotion,本人已几经周折试验成功!
- 使用glide 如何实现高度自适应t图片:
- Windows下QWT绘图实例
- YII框架递归
- poj 2386 Lake Counting
- eclipse在ubuntu16.04无法设置以及新建工程卡死解决方案
- Openwrt编译进阶
- Android中Application类用法