题意:
有三个柱子,n个圆盘按照A排列从上到下排列在第一个柱子上,每次操作可将一个柱子最上面的圆盘移动到另一个柱子上。
要使得这n块圆盘在任意同一柱子上,且从上到下编号递增。
最多操作10^6次,输出每次操作。
分析:
题目没有规定操作次数的具体限制,我们的操作方案甚至可以不是最优的!相同算法操作次数同阶,那么目标柱子的选定也不是那么必要了。
假定3为目标柱子,那么1、2两个柱子作为转移的辅助柱子足够完成任务。
操作比较明晰:
每次将当前柱子(1或2)上的盘子依次移走,如果盘子编号是当前未处理中最大的,则移到3柱,否则移到另一个辅助柱上。
操作次数是n+(n-1)+...+2+1,O(n^2)级别的。
模拟的代码各有各的写法,自己看着清晰最重要了吧。
const int N=10000+10; int n,K,a[N],b[N],tot; int main() { n=read(); F(i,1,n) a[i]=read(); K=n*(1+n)/2;printf("%d\n",K); D(x,n,1){ tot=x; F(i,1,x){ if(a[i]!=x){ b[--tot]=a[i]; if((n-x)%2) puts("2 1"); else puts("1 2"); } else printf("%d 3\n",(n-x)%2?2:1); } swap(a,b); } return 0; }