AT_ahc059_a [AHC059A] Stack to Match Pairs
题目描述
有一个 $N \times N$ 的网格。左上角的格子的坐标为 $(0,0)$,从这里向下移动 $i$ 格、向右移动 $j$ 格后到达的格子的坐标为 $(i,j)$。
$N$ 是偶数,对于每一个从 $0$ 到 $\frac{N^2}{2}-1$ 的数字,恰好有两张写有该数字的卡牌。初始时,每个格子上正好放置了一张卡牌。
你从位置 $(0,0)$ 出发,手中持有一个空牌堆,然后重复以下操作:
1. 向上、下、左或右的相邻格子移动。你不能走出 $N \times N$ 的网格范围。
2. 如果你当前位置上有卡牌,则可以将该卡牌放到你牌堆的顶部。如果这之后你牌堆顶端的两张卡牌数字相同,这两张卡牌会被从牌堆中移除。
3. 如果你当前位置上没有卡牌,你可以将牌堆顶端的卡牌放置在当前位置。若你的牌堆为空或当前位置已经有卡牌,则不能执行此操作。
最多可以执行 $2N^3$ 次操作。你的目标是让网格和你的牌堆中所有的卡牌都被消除。请找出一个能够极小化“移动”次数的操作序列。注意,操作 2 和 3 的操作次数计入操作数限制,但并不影响评测分数。
输入格式
输入通过标准输入给出,格式如下:
> $N$ $a_{0,0}$ $\cdots$ $a_{0,N-1}$ $\vdots$ $a_{N-1,0}$ $\cdots$ $a_{N-1,N-1}$
- 所有测试用例均满足 $N = 20$。
- $a_{i,j}$ 表示最初放置在格子 $(i,j)$ 上的卡牌上的数字,是满足 $0 \leq a_{i,j} \leq \frac{N^2}{2} - 1$ 的整数。
- 每个 $a_{i,j}$ 出现恰好两次。
输出格式
每个回合 $t$ 的操作以单个字符 $c_t$ 表示,含义如下:
1. 操作 1(移动),用如下字符表示方向:向上:“U”、向下:“D”、向左:“L”、向右:“R”
2. 操作 2(拿起卡牌):`Z`
3. 操作 3(放下卡牌):`X`
设 $T$ 为总操作次数。请按如下格式输出到标准输出:
> $c_0$
>
> $\vdots$
>
> $c_{T-1}$
说明/提示
### 计分方式
设你的操作序列中移动次数为 $K$,最终网格和牌堆中剩余卡牌数为 $X$,得分计算如下:
- 若 $X=0$,得分为 $N^2 + 2N^3 - K$;
- 若 $X>0$,得分为 $N^2 - X$。
### 输入生成
初始的卡牌 $a_{i,j}$ 是将所有 $N^2$ 张卡随机打乱后依次放在 $N \times N$ 网格中的。
### 工具(输入生成器和可视化)
- [网页版工具](https://img.atcoder.jp/ahc059/b8ckwh7N.html?lang=zh-hans):支持动画和手动游玩,比本地版功能更强。
- [本地版工具](https://img.atcoder.jp/ahc059/b8ckwh7N.zip):需要安装 [Rust 语言环境](https://www.rust-lang.org/)。
- [Windows 预编译版](https://img.atcoder.jp/ahc059/b8ckwh7N_windows.zip):若你不熟悉 Rust,可以使用此工具。
请注意,比赛期间禁止分享可视化结果或者讨论解法与思路。
由 ChatGPT 5 翻译