AT_abc336_f [ABC336F] Rotation Puzzle

题目描述

有一个 $H$ 行 $W$ 列的网格,最初每个格子中恰好写有一个 $1$ 到 $H\times W$ 之间的整数,且每个整数只出现一次。 具体来说,对于 $1\leq i\leq H$,$1\leq j\leq W$,从上到下第 $i$ 行、从左到右第 $j$ 列的格子中写有 $S_{i,j}$。 下面,将从上到下第 $i$ 行、从左到右第 $j$ 列的格子称为格子 $(i,j)$。 你可以重复进行如下操作,**最多 $20$ 次**(也可以不进行操作): 对于任意整数对 $(i,j)$($1\leq i\leq H,\ 1\leq j\leq W$),判断能否通过操作使得格子 $(i,j)$ 中写有 $((i-1)\times W+j)$, 如果可以,请输出所需的最小操作次数。 如果 $20$ 次以内无法达成(包括无论操作多少次都无法达成的情况),请输出 $-1$。 > 操作:从网格中选择一个 $(H-1)\times (W-1)$ 的矩形区域,将其旋转 $180$ 度。 > 更严格地说,选择整数 $x,y$($0\leq x,y\leq 1$), > 对于所有满足 $1\leq i\leq H-1$,$1\leq j\leq W-1$ 的整数对 $(i,j)$,同时将格子 $(i+x,j+y)$ 中的整数与格子 $(H-i+x,W-j+y)$ 中的整数交换。 注意,只要格子中写有的整数满足条件即可,不需要考虑写入的方向等其它因素。

输入格式

输入按以下格式从标准输入读入。 > $H$ $W$ $S_{1,1}$ $S_{1,2}$ $\ldots$ $S_{1,W}$ $S_{2,1}$ $S_{2,2}$ $\ldots$ $S_{2,W}$ $\vdots$ $S_{H,1}$ $S_{H,2}$ $\ldots$ $S_{H,W}$

输出格式

输出满足题目条件所需的最小操作次数。 如果无法在 $20$ 次以内达成条件,则输出 $-1$。

说明/提示

### 限制条件 - $3\leq H,W\leq 8$ - $1\leq S_{i,j}\leq H\times W$ - 若 $(i,j)\neq (i',j')$,则 $S_{i,j}\neq S_{i',j'}$ - 输入均为整数 ### 样例解释 1 按照如下顺序进行操作,可以在 $2$ 次操作内满足题目条件: - 选择左上角的矩形区域进行操作,即选择 $x=0$,$y=0$。 - 选择右下角的矩形区域进行操作,即选择 $x=1$,$y=1$。 而无法在 $1$ 次或更少操作内达成条件,因此输出 $2$。 ![](https://img.atcoder.jp/abc336/75a97e79fc11bfe9406ef4e3bef74f37.png) ### 样例解释 2 无法在 $20$ 次以内达成条件,因此输出 $-1$。 由 ChatGPT 4.1 翻译