博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UOJ#152. 【UR #10】汉诺塔
阅读量:4317 次
发布时间:2019-06-06

本文共 1465 字,大约阅读时间需要 4 分钟。

题目:http://uoj.ac/problem/152

orzKPM。。。

分治,把数字是l~mid的拿出来放在一根柱子上,mid+1~r放在另一根柱子上。如此递归下去,每次递归只是改一下方向,l,r。然后只要处理r-l<=1的情况就可以了。

#include 
#include
#include
#include
#include
#include
#include
#define rep(i,l,r) for (int i=l;i<=r;i++)#define down(i,l,r) for (int i=l;i>=r;i--)#define clr(x,y) memset(x,y,sizeof(x))#define maxn 1000500#define ll long long#define inf int(1e9)using namespace std;int ansx[maxn],ansy[maxn],a[3][maxn],N[3];int tot;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)){ if (ch=='-') f=-1; ch=getchar();} while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f;}void move(int x,int y){ ansx[++tot]=x+1,ansy[tot]=y+1; a[y][++N[y]]=a[x][N[x]--];}void dfs(int x,int l,int r,int dir){ if (l==r) return; if (r-l<=1){ if ((dir==0&&a[x][N[x]-1]
a[x][N[x]])){ move(x,(x+1)%3); move(x,(x+2)%3); move((x+1)%3,x); move((x+2)%3,x); } return; } int mid=(l+r)/2; int y=(x+1)%3,z=(x+2)%3; rep(i,l,r) if (a[x][N[x]]<=mid) move(x,y); else move(x,z); dfs(y,l,mid,1-dir); dfs(z,mid+1,r,1-dir); if (dir==0){ down(i,r,mid+1) move(z,x); down(i,mid,l) move(y,x); } else { rep(i,l,mid) move(y,x); rep(i,mid+1,r) move(z,x); }}int main(){ int n=read(); down(i,n,1) a[0][i]=read(); N[0]=n; dfs(0,1,n,0); printf("%d\n",tot); rep(i,1,tot) printf("%d %d\n",ansx[i],ansy[i]); return 0;}

 

转载于:https://www.cnblogs.com/ctlchild/p/5023691.html

你可能感兴趣的文章
LIS(单调队列优化 C++ 版)(施工ing)
查看>>
如何为winform程序打包(图解)
查看>>
如何给行内元素设置宽高?
查看>>
刚接触Vuex
查看>>
四种加载React数据的技术对比(Meteor 转)
查看>>
Airthmetic_Approching
查看>>
操作文本文件
查看>>
公司项目的几个问题
查看>>
解决win7下打开Excel2007,报“向程序发送命令时出现问题”的错误
查看>>
Velocity快速入门教程
查看>>
Google的小秘密
查看>>
(转)什么是JSON+如何处理JSON字符串
查看>>
(译)理解python线程
查看>>
【总结】动态树
查看>>
【vuejs深入二】vue源码解析之一,基础源码结构和htmlParse解析器
查看>>
编程中的24条经典语录
查看>>
Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)
查看>>
chrome 低版本的background-attachment: fixed问题
查看>>
C++编程思想1
查看>>
如何避免 await/async 地狱
查看>>