4282 - 像素描边(border)

题目描述

学校美术社要把一幅像素画制作成展板。画布由 HW 列的正方形格子组成,从上到下编号为 1H,从左到右编号为 1W

字符 # 表示对应格子已经着色,字符 . 表示对应格子没有着色。美术社准备沿着所有着色区域的边界贴上窄纸条:

  • 只有着色格与未着色格之间的公共边,以及着色格位于画布边缘时朝向画布外的边,才属于边界;
  • 一张纸条必须是水平或竖直的直线段
  • 同一直线方向上连续的边界可以使用同一张纸条;
  • 边界一旦拐弯,就必须换一张新纸条。

如果两个着色格只在一个顶点处接触,它们的边界在该点视为互不连接,纸条不能穿过这个接触点继续延伸。

例如,一个单独的着色格需要 4 张纸条;一个实心矩形无论大小都只需要 4 张纸条。

请你求出完成整幅像素画的描边最少需要多少张纸条。

输入

第一行输入两个整数 H,W,表示画布的行数和列数。

接下来 H 行,每行输入一个长度为 W 的字符串,仅包含字符 #.,表示像素画。

输出

输出一行一个整数,表示所需纸条的最少数量。

样例

输入

4 5
##...
.#...
.###.
.....

输出

8

输入

6 7
#..##..
.#.##..
..#....
..###..
#......
......#

输出

26

输入

10 12
###....#....
.##...###...
..#....#....
..####......
.....#..##..
.##..#..##..
.##..####...
......#.....
..#####..#..
............

输出

44
说明

样例说明 1

从最上方的水平边开始沿着着色区域外侧描边,每遇到一次转弯就换一张纸条。绕完整个边界会经过 8 个转弯,因此共需 8 张纸条。

注意,相邻着色格之间的公共边位于着色区域内部,不需要贴纸条。

样例说明 2

本组图案包含多个互不相连的部分,也包含只在顶点处接触的着色格。只在顶点处接触的两段边界不能合并。

数据范围

对于所有测试数据,保证:

  • 1\le H,W\le 1000
  • 输入字符仅包含 #.
  • 画布中至少有一个着色格。

本题共 10 个测试点,每个测试点 10 分。

测试点编号H\leW\le特殊性质
133
21010
3100100A
410001000A
5100100B
610001000B
7100100
8\sim1010001000

特殊性质 A:任意两个着色格都没有公共边

特殊性质 B:所有着色格恰好组成一个边平行于画布边缘的实心矩形

标签
题目参数
时间限制 1 秒
内存限制 512 MB
提交次数 0
通过人数 0
金币数量 2 枚
难度 基础


上一题 下一题