CF518F Pasha and Pipe
题目描述
在一次执政党“A”的会议上,部长 Pavel 提议改善下水道系统,并在城市中新建一条管道。
城市地图是一个 $n \times m$ 的矩形网格。每个格子要么为空(则管道可以通过),要么被占据(管道不能通过)。空格子用字符 $.$ 表示,被占据的格子用字符 $# $ 表示。
管道必须满足以下要求:
- 管道宽度为 $1$,形状为折线;
- 管道只能经过空格子;
- 管道必须从场地的边界上开始,但不能从角落格子开始;
- 管道必须在场地的边界上结束且也不能在角落格子结束;
- 管道最多只能有 $2$ 个 $90^\circ$ 转弯;
- 管道与场地边界格子的重合点恰好为两个格子;
- 如果管道是一条直线段,则起点和终点必须分别位于不同的边;
- 对于管道上的每一个非边界格子,恰好有两个相邻边上的格子也在管道上;
- 对于管道上的每一个边界格子,恰好有一个相邻边上的格子也在管道上。
下面是几组允许的管道示例:
....# ....# .*..#
***** ****. .***.
..#.. ..#*. ..#*.
#...# #..*# #..*#
..... ...*. ...*.
下面是几组不允许的管道示例:
.**.# *...# .*.*#
..... ****. .*.*.
..#.. ..#*. .*#*.
#...# #..*# #*.*#
..... ...*. .***.
在这些示例中,管道用字符 $*$ 表示。 你的任务是编写一个程序,计算在城市中恰好铺设一条符合要求的管道的不同方式有多少种。 如果两种管道至少在一个格子上不同,则认为它们是不同的方案。
....# ....# .*..#
***** ****. .***.
..#.. ..#*. ..#*.
#...# #..*# #..*#
..... ...*. ...*.
下面是几组不允许的管道示例:
.**.# *...# .*.*#
..... ****. .*.*.
..#.. ..#*. .*#*.
#...# #..*# #*.*#
..... ...*. .***.
在这些示例中,管道用字符 $*$ 表示。 你的任务是编写一个程序,计算在城市中恰好铺设一条符合要求的管道的不同方式有多少种。 如果两种管道至少在一个格子上不同,则认为它们是不同的方案。
输入格式
输入的第一行为两个整数 $n, m$($2 \leq n, m \leq 2000$),分别表示 Berland 地图的高度与宽度。
接下来的 $n$ 行,每行包含 $m$ 个字符,表示城市的地图。
如果格子上是字符 $.$,表示该格子为空,管道可以通过。
如果格子上是字符 $# $,表示该格子已被占据,管道不可通过。
输出格式
输出一行,包含一个整数,表示不同管道铺设方案的数量。
说明/提示
在第一个样例中,共有 $3$ 种方案(用 $*$ 标记):
.*. .*. ...
.*# **# **#
.*. ... .*.
由 ChatGPT 5 翻译
.*. .*. ...
.*# **# **#
.*. ... .*.
由 ChatGPT 5 翻译