P14907 [NHSPC 2024] 蓋蓋樂

Background

$\textcolor{red}{\textbf{本題為 Output Only。}}$

Description

蓋蓋樂是一人策略遊戲。給定一個大棋盤,棋盤分成 $m\times n$ 個區塊,相鄰區塊分別塗上白色與灰色以做區隔。每個區塊都是個 $5\times 5$ 的方形小棋盤,每個小棋盤最多會有 $2$ 個特殊的格子。舉例來說,下圖是一個 $2\times 3$ 的大棋盤 $(m = 2, n = 3)$,其中有五個格子是特殊格子(以 $\texttt{X}$ 標示)。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/e2hjxir8.png) ::: 蓋蓋樂有兩種積木(如下圖所示),分別可用以蓋住棋盤上 $4$ 或 $3$ 個格子。兩種積木分別可以任意旋轉 $0, 90, 180, 270$ 度後再蓋住棋盤格子,但是特殊的格子不可以被蓋住。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/v5rzy06s.png) ::: 請用以上兩種積木把大棋盤蓋滿(特殊格子除外),使得**共用積木的區塊對**越少越好。 * 也就是說,只要有兩個區塊共用了同一塊積木,無論他們共用了幾塊,都會被算做一個「共用積木的區塊對」。你的目標就是最小化這個區塊對的數量。 在本題中,保證任意兩個特殊格子**皆不八方位相鄰**。也就是說,對於任兩個特殊格子座標 $(a, b), (c, d)$,皆有 $\max(|a - c|, |b - d|) > 1$。

Input Format

$$\begin{aligned} &n \ m \\ &a_{1, 1} \ a_{1, 2} \ \cdots \ a_{1, 5m} \\ &a_{2, 1} \ a_{2, 2} \ \cdots \ a_{2, 5m} \\ &\vdots \\ &a_{5n, 1} \ a_{5n, 2} \ \cdots \ a_{5n, 5m} \end{aligned}$$ * $n, m$ 為棋盤的大小。 * $a_{i, j}$ 代表棋盤第 $i$ 列第 $j$ 欄的格子是否為特殊格子(也就是不能被蓋住的格子),以 $0$ 或 $-1$ 表示,其中 $0$ 代表可被蓋住的棋盤格子,$-1$ 代表特殊的格子。

Output Format

$$\begin{aligned} & b_{1, 1} \ b_{1, 2} \ \cdots \ b_{1, 5m} \\ & b_{2, 1} \ b_{2, 2} \ \cdots \ b_{2, 5m} \\ & \vdots \\ & b_{5n, 1} \ b_{5n, 2} \ \cdots \ b_{5n, 5m} \end{aligned}$$ 請將棋盤蓋滿(特殊格子除外)後送回評分。積木蓋住棋盤的表示方式如下: * 同一塊積木需以相同的**正整數**作為代號,例如 $1, 2, 3, \ldots$,但代號最大不可超過 $15000$。特殊格子必須維持以 $-1$ 代表之。 * 不同塊積木**不可以**使用相同的代號。

Explanation/Hint

### 範例 作為範例,假設測試資料的長相為 ``` 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ``` 則下面是一個可能的合法輸出 ``` 1 1 2 2 3 3 11 12 12 12 12 21 21 21 21 1 -1 2 4 3 13 11 11 14 15 15 15 15 22 22 5 5 6 4 4 13 13 16 14 14 23 23 -1 22 24 5 7 6 6 8 8 17 16 16 18 23 25 25 24 24 9 7 7 10 8 19 17 17 20 18 18 25 26 27 27 9 9 28 10 10 19 19 35 20 20 41 26 26 27 42 29 29 28 28 30 -1 36 35 35 37 41 41 43 42 42 29 31 32 32 30 30 36 36 38 37 37 43 43 44 44 31 31 32 -1 33 33 39 38 38 -1 45 45 45 45 44 34 34 34 34 33 39 39 40 40 40 40 46 46 46 46 ``` 在這個範例中,最佳解的共用積木區塊對數量為 $1$,而上面輸出的任兩個相鄰區塊都有共用積木,得到區塊對數量為 $7$,表示 $p$ 和 $q$ 的值分別為 $1$ 和 $7$。因此,假設分數比重 $S=10$,這個輸出可以獲得 $S\cdot\max\left(\frac{1}{10}, \frac{1}{\sqrt{7 - 1 + 1}}\right) \approx 3.78$ 分。 ### 視覺化工具(Visualizer) 為了方便選手觀看自己的輸出結果以及觀察測試資料,在此任務的附件(attachment)中,有一腳本程式(script)供選手視覺化(visualize)輸入檔與輸出檔。 請利用下列指令視覺化輸入檔。 ``` python3 visualizer.py [input file] ``` 你可利用下列指令,將你對於某個輸入計算出的解做視覺化。因為技術上的限制,附件中提供的視覺化工具在棋盤過大時,僅會顯示前 $10$ 排、以及前 $10$ 欄的方形小棋盤。 ``` python3 visualizer.py [input file] --solution [output file] ``` 為了方便辨識,程式會以上色每塊積木的方式輸出,而不輸出積木上面的數字。但由於顏色數量有限,程式會重新為所有積木上色並僅保證相鄰的積木不同色。 範例: ``` python3 visualizer.py input_1_1.txt --solution output_1_1.txt ``` 請注意,若你傳入的資料的格式並不合法,將會產生一些不可預期的行為。不過,當你的解答唯一違反的規則是「未蓋滿所有格子」時,將未被蓋到的格子留下數字 $0$ 會讓該格子呈現白色,並正常的進行視覺化。 一張使用前面範例所提到的視覺化成果圖如下: :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/iwqyzy9d.png) ::: ### 測資限制 * $1\le n\times m\le 1600$。 * $-1 \leq a_{i, j} \leq 0$。 * 輸入的數字皆為整數。 * 保證任一個被劃分出來的 $5\times 5$ 方形小棋盤內,特殊格子數量都不超過 $2$。 * 保證存在一種可以蓋滿棋盤的方式。 * 保證任意兩個特殊格子皆不八方位相鄰。 ### 評分說明 本題共有 10 組測試資料,輸入檔案的說明如表所示。 對於每一組測試資料,若你上傳的輸出檔案滿足輸出格式,並且成功蓋滿了所有除了特殊格子以外的格子,那麼你會得到以下分數 $$ S \cdot \max\left(\frac{1}{10}, \frac{1}{\sqrt{q - p + 1}}\right) $$ 其中 $S$ 是該測試資料的分數比重,$p$ 是最佳解的共用積木區塊對數量、$q$ 是你給出的構造內的共用積木區塊對數量。 若你上傳的輸出檔案不滿足輸出格式、或是沒有蓋滿所有除了特殊格子以外的格子,那麼你將得到 $0$ 分。 | 測試資料 | 分數比重 $S$ | 輸入檔名 | 輸出檔名 | 說明 | | :------: | :----: | :----: | :----: | ------------ | | 1 | 4 | `input_1_1.txt` | `output_1_1.txt` | $n = 1$,$m = 1$。| | 2 | 4 | `input_2_1.txt` | `output_2_1.txt` | $n = 1$,$m = 2$。| | 3 | 6 | `input_3_1.txt` | `output_3_1.txt` | $n = 1$,$m = 3$。| | 4 | 8 | `input_4_1.txt` | `output_4_1.txt` | $n = 2$,$m = 2$。| | 5 | 10 | `input_5_1.txt` | `output_5_1.txt` | $n = 10$,$m = 10$。| | 6 | 12 | `input_6_1.txt` | `output_6_1.txt` | $n = 10$,$m = 10$。| | 7 | 8 | `input_7_1.txt` | `output_7_1.txt` | $n = 1$,$m = 1599$。| | 8 | 20 | `input_8_1.txt` | `output_8_1.txt` | $n = 20$,$m = 24$。| | 9 | 20 | `input_9_1.txt` | `output_9_1.txt` | $n = 40$,$m = 40$。| | 10 | 8 | `input_10_1.txt` | `output_10_1.txt` | $n = 39$,$m = 39$。|