AT_tenka1_2012_8 大爆発

题目描述

给定一个由格子组成的舞台,你需要用炸弹将舞台上存在的所有方块全部摧毁。 炸弹只能放在没有方块的格子上,放置后会立即爆炸,并摧毁其上下左右所有的方块。 例如,在如图 $1$ 所示的舞台上,如果在坐标 $(1,3)$ 处放置炸弹,则可以摧毁上下左右 $5$ 个方块。 本题中,坐标的定义为舞台左上角的格子为 $(0,0)$,向右一格为 $(1,0)$,向下一格为 $(0,1)$。 即使炸弹与方块之间不相邻(如图 $1$ 中炸弹上方的方块),也可以被摧毁,并且无论连续有多少个方块,都会全部被摧毁。 同样,即使方块之间不相邻(如图 $1$ 中炸弹右侧的方块),也都会被摧毁。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_tenka1_2012_8/f1e2e278d6a1916ec0af40907a845b851be57aab.png) 图 $1$ :炸弹摧毁方块的示例 请你计算,为了摧毁舞台上所有的方块,最少需要放置多少个炸弹。 如果无法摧毁所有方块,则输出 $-1$。 输入以如下格式从标准输入给出: $H$ $W$ $c_{(0,0)}c_{(1,0)}\ldots c_{(W-1,0)}$ $c_{(0,1)}c_{(1,1)}\ldots c_{(W-1,1)}$ $\vdots$ $c_{(0,H-1)}c_{(1,H-1)}\ldots c_{(W-1,H-1)}$ - 输入共 $H+1$ 行。 - 第 $1$ 行为两个整数,分别表示舞台的高 $H$ $(1 \leq H \leq 16)$ 和宽 $W$ $(1 \leq W \leq 16)$,以空格分隔。 - 接下来的 $H$ 行,每行 $W$ 个字符,表示舞台每个格子的状态 $c_{(i,j)}$ $(0 \leq i \leq W-1,\ 0 \leq j \leq H-1)$。 - $c_{(i,j)}$ 取以下两种值之一,分别表示坐标 $(i,j)$ 的格子的状态: - `.` :该格子没有方块,可以放置炸弹。 - `#` :该格子有方块,不能放置炸弹。 如果只对小尺寸舞台($1 \leq W \leq 5,\ 1 \leq H \leq 5$)的输入给出正确答案,则可获得 $100$ 分满分中的 $50$ 分部分分。 请输出使舞台上不再存在任何方块所需的最小炸弹数。如果无法做到,则输出 $-1$。 请注意,输出时行末需换行。 ``` 5 5 .#.#. .#... ...#. #.#.# #...# ``` ``` 2 ``` - 初始状态如图 $1$,首先在坐标 $(1,3)$ 处放置炸弹,可以摧毁坐标 $(0,3),\ (1,0),\ (1,1),\ (2,3),\ (4,3)$ 的方块。 - 然后在坐标 $(3,4)$ 处放置炸弹,可以摧毁剩余的所有方块。 - 因此,最少需要 $2$ 个炸弹。 ``` 5 5 .#... .#... ##### .#... .#... ``` ``` 3 ``` - 首先在坐标 $(0,1)$ 处放置炸弹,可以摧毁 $(0,2)$ 和 $(1,1)$ 的方块。 - 然后在坐标 $(1,1)$ 处放置炸弹,可以摧毁 $(1,0),\ (1,2),\ (1,3),\ (1,4)$ 的方块。 - 最后在坐标 $(1,2)$ 处放置炸弹,可以摧毁剩余的方块。 - 因此,最少需要 $3$ 个炸弹。 ``` 1 6 ###### ``` ``` -1 ``` - 没有任何格子可以放置炸弹,无法摧毁方块。 ``` 3 2 .. .. .. ``` ``` 0 ``` - 初始状态下没有任何方块,无需放置炸弹。

输入格式

第一行包含两个整数 $H$ 和 $W$,分别表示舞台的高和宽。 接下来的 $H$ 行,每行 $W$ 个字符,表示舞台每个格子的状态。

输出格式

输出一个整数,表示摧毁所有方块所需的最小炸弹数。如果无法摧毁所有方块,则输出 $-1$。

说明/提示

无。 由 ChatGPT 4.1 翻译