6
13
2016
0

【UR #10A】【归并思想】汉诺塔

题意:

有三个柱子,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;
}
Category: 树套树 | Tags: 排序 构造 构造题 | Read Count: 559

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com