#loj5557. 「POI2026 R1」Hanoj
「POI2026 R1」Hanoj
#5557. 「POI2026 R1」Hanoj
标签: 传统 | 时间限制: 6000 ms | 内存限制: 256 MiB |
题目描述
题目译自 XXXIII Olimpiada Informatyczna – I etap Hanoj
Bajtyna 在一个可疑网站上买了一款玩具,本以为会收到经典的「汉诺塔」,结果收到的是「哈诺伊塔」(Wieże Hanoj)。
哈诺伊塔由 个柱子组成,上面总共有 个大小各不相同的圆盘,编号从 到 。
在游戏的任意时刻,每个柱子上的圆盘从顶部到底部必须严格递增排序(即越靠近底部编号越大)。
允许的唯一操作只有一种:
把任意柱子最顶上的圆盘取下,放到任意柱子的最底部。
Bajtyna 想知道:最少需要多少次这样的操作,才能把所有圆盘都移动到同一个柱子上。
请你帮她求出这个最小操作次数,并输出一种合法的操作方案。
输入格式
第一行两个整数 ,分别表示圆盘数量和柱子数量。柱子编号从 到 。
接下来 行,第 行描述第 个柱子的初始状态:
首先一个整数 表示该柱子上的圆盘数量,接着 个整数 ,表示从顶部到底部的圆盘编号,且满足 $1 \leq v_{i,1} < v_{i,2} < \cdots < v_{i,k_i} \leq n$。
所有圆盘编号互不相同,且恰好覆盖 到 (即 )。
输出格式
如果无法把所有圆盘聚集到同一个柱子,只输出一行 -1。否则第一行输出一个整数 ,表示最少的操作次数。 接下来 行,每行两个整数 , 表示把柱子 最顶上的圆盘移动到柱子 的最底部。如果有多种方案,输出任意一种即可。
只要你输出的第一行(即操作次数 )正确,即使后面的移动序列缺失或错误,你仍能得到该测试点 的分数。
样例 1
输入
3 3
1 2
2 1 3
0
输出
3
2 3
1 3
2 3
初始状态:
- 柱子 :顶部
- 柱子 :顶部
- 柱子 :空
操作过程:
- 把柱子 最上面的 放到柱子 底部 柱子 :
- 把柱子 最上面的 放到柱子 底部 柱子 :
- 把柱子 最上面的 放到柱子 底部 柱子 :
整个过程始终保持每个柱子柱严格递增,最终所有圆盘都在柱子 上。
样例 2
输入
7 3
4 1 2 5 7
1 4
2 3 6
输出
-1
不可能达成目标,故输出 -1。
附加样例
- 个圆盘, 个柱子,其中一个柱子为空
- 个圆盘, 个柱子,其中一个为空,另外两个分别放偶数编号和奇数编号的圆盘
- ,每个柱子上恰好一个圆盘
数据范围与提示
详细子任务附加限制及分值如下表所示。
| 子任务 | 附加限制 | 分值 |
|---|---|---|
| 存在某个 | ||
| 无附加限制 |