P13452 [GCJ 2009 Finals] Marbles

题目描述

在一个方格坐标系上,你有 $2n$ 个弹珠。这些弹珠被涂成 $n$ 种不同的颜色,每种颜色恰好有 $2$ 个弹珠。所有弹珠被依次放在坐标 $(1,0)$、$(2,0)$、$\ldots$、$(2n, 0)$ 上。 你的任务是为每种颜色画一条路径,将该颜色的两个弹珠连接起来。每条路径应由若干条垂直或水平的线段组成,且这些线段必须连接在网格点上。任意两条路径不能相交或相触。任意一条路径都不能穿过 $y=0$ 这条直线。每条路径只能在它所连接的两个弹珠的位置与 $y=0$ 相接,因此每条路径的首尾线段必须是竖直的。 给定弹珠的排列方式,返回一个解方案的最小高度,如果不存在合法解,则返回 $-1$。高度定义为所有路径所经过的最大 $Y$ 坐标与最小 $Y$ 坐标之差。 例如: ``` red red blue yellow blue yellow ``` 一种可行的解法如下: ``` +---+ +-----------+ | | | | red red blue yellow blue yellow | | +-----------+ ``` 在这个例子中,最小高度为 $2$。

输入格式

输入的第一行为测试用例数 $T$。接下来有 $T$ 组测试数据。每组的第一行为 $n$,表示弹珠颜色种类数。下一行为 $2n$ 个用空格分隔的单词,按从左到右顺序分别表示每个弹珠的颜色。每个颜色由小写字母('a' 到 'z')组成,长度不超过 $10$ 个字符。每种颜色恰好出现两次。

输出格式

对于每组测试数据,输出一行,格式如下: Case #$x$: 其中 $x$ 是测试编号(从 $1$ 开始),后接一个最优解的最小高度。如果不存在合法解,输出 $-1$。

说明/提示

**限制条件** - $1 \leq T \leq 50.$ **小数据集(7 分)** - 时间限制:3 秒 - $1 \leq n \leq 20.$ **大数据集(32 分)** - 时间限制:6 秒 - $1 \leq n \leq 500.$ 翻译由 ChatGPT-4.1 完成。