你正在创建一个新的《跑跑卡丁车》(KartRider)赛道。赛道是一个 $H \times W$ 的矩形棋盘。棋盘的每个格子要么是空的,要么包含一个如下图所示的图块。
注意,每个图块都可以旋转,除了一种图块外,其余图块都有道路从图块中延伸出来。我们将第四种图块(图中高亮为蓝色的部分)称为“卷曲图块”(curly tile)。
在一个合法的《跑跑卡丁车》赛道中,每个格子都必须包含一个图块,且图块内的道路不应出现死胡同。换句话说,从图块延伸出的每一条道路都必须连接到相邻图块的道路上。此外,道路不能朝向棋盘外部。
目前,棋盘上已经放置了一些卷曲图块。你可以在棋盘上放置零个或多个卷曲图块并提交赛道。随后,管理员将尽其所能填充所有剩余的空位(不一定填充卷曲图块),使其成为一个合法的《跑跑卡丁车》赛道。注意,你只能放置卷曲图块,且不能移除、替换或旋转棋盘上已有的卷曲图块。
此外,对于某些格子,你不能放置图块;而对于另一些格子,你必须放置卷曲图块。
请找出你能放置的卷曲图块的最大数量,使得管理员能够填充剩余格子并创建一个合法的《跑跑卡丁车》赛道。你需要报告赛道中卷曲图块的总数,而不是你新添加的卷曲图块的数量。如果无法创建合法的《跑跑卡丁车》赛道,请输出 $-1$。
输入格式
第一行包含两个整数 $H$ 和 $W$,表示棋盘的大小。($1 \le H, W \le 100$)
接下来的 $H$ 行包含棋盘的信息。每行包含 $W$ 个字符,含义如下:
- “1”:包含连接上方和左侧格子道路的卷曲图块,
- “2”:包含连接下方和左侧格子道路的卷曲图块,
- “3”:包含连接上方和右侧格子道路的卷曲图块,
- “4”:包含连接下方和右侧格子道路的卷曲图块,
- “o”:必须放置卷曲图块的空位,
- “x”:不能放置图块的空位,
- “.”:没有任何限制的空位。
输出格式
输出你能放置的卷曲图块的最大数量,使得管理员能够填充剩余格子并创建一个合法的《跑跑卡丁车》赛道。你需要报告赛道中卷曲图块的总数,而不是你新添加的卷曲图块的数量。如果无法创建合法的《跑跑卡丁车》赛道,请输出 $-1$。
样例
样例输入 1
4 5 4...x .2..2 .o1x. 3..3o
样例输出 1
12
样例输入 2
2 3 4o2 3x1
样例输出 2
-1
说明
下图展示了第一个样例输入中棋盘的初始状态。
下图展示了最优解中棋盘的最终状态。管理员放置的图块以黄色高亮显示。