QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 256 MB Total points: 100 Hackable ✓

#14112. Hanoi

Statistics

经典的“汉诺塔”问题是将 $n$ 个大小互不相同的圆盘在 3 根柱子之间移动。在一步操作中,玩家只能将某根柱子最顶端的圆盘移动到另一根柱子的最顶端。圆盘在柱子上必须始终保持自底向上大小递减的顺序(即大盘在下,小盘在上)。最初,这 $n$ 个圆盘都位于 1 号柱子上,目标是将它们全部移动到 3 号柱子上。

传说在一座印度寺庙里,僧侣们自创世以来就一直在解决 64 个圆盘的“汉诺塔”问题。人们相信,一旦这个问题被解决,世界就会毁灭。

然而,这个“宽松汉诺塔”(Relaxed Hanoi)问题并没有那么具有毁灭性。事实上,它相当乐观,因为一旦你正确解决了它,你就会得到通过(Accepted)。在这个变种中,1 号柱子不受顺序规则的限制。换句话说,在任何时刻,1 号柱子上的圆盘都可以以任意顺序排列。

对于给定的“宽松汉诺塔”问题实例,请提供最多 $2 \cdot n^2$ 步移动来解决该问题。

输入格式

第一行包含一个整数 $n$ ($1 \le n \le 500$) —— 圆盘的数量。

第二行包含 $n$ 个整数 $p_1, p_2, \dots, p_n$ —— 1 号柱子上从底到顶的圆盘大小($p_1$ 是最底部的圆盘,$p_n$ 是最顶部的圆盘)。

保证 $p_1, p_2, \dots, p_n$ 构成一个 $1$ 到 $n$ 的排列(换句话说,$1$ 到 $n$ 中的每个数字在 $p_1, p_2, \dots, p_n$ 中恰好出现一次)。

输出格式

第一行应包含一个整数 $k$ ($0 \le k \le 2 \cdot n^2$) —— 移动的步数。

接下来的 $k$ 行,每行应包含两个整数 $a_i$ 和 $b_i$ ($1 \le a_i, b_i \le 3$),表示将最顶端的圆盘从 $a_i$ 号柱子移动到 $b_i$ 号柱子。

最终,所有 $n$ 个圆盘都必须位于 3 号柱子上。

样例

输入样例 1

5
2 1 5 3 4

输出样例 1

9
1 2
1 2
1 3
2 1
2 3
1 3
1 2
1 3
2 3

说明

样例输出仅用了 9 步。对于 $n = 5$,任何不超过 50 步的解法都是可行的。

  • 在第 1、2、3 步移动后,状态为 $\langle 2, 1 \rangle \langle 4, 3 \rangle \langle 5 \rangle$。
  • 第 4 步移动是合法的,因为 1 号柱子是宽松的。状态为 $\langle 2, 1, 3 \rangle \langle 4 \rangle \langle 5 \rangle$。
  • 在第 5、6 步移动后,状态为 $\langle 2, 1 \rangle \langle \rangle \langle 5, 4, 3 \rangle$。
  • 最后的第 7、8、9 步移动决定了最终状态为 $\langle \rangle \langle \rangle \langle 5, 4, 3, 2, 1 \rangle$。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.