#330. 问题4:奶牛选美(pageant)

问题4:奶牛选美(pageant)

题目描述

听说最近的流行趋势是皮肤上有两个斑点的奶牛, Farmer John 买了一整群两个斑点的牛。不幸的是,流行趋势是变化得很快的,目前最流行的趋势是只有一个斑点的奶牛!

FJ 想对他的每只牛都进行一些涂改,使得两个斑点被合并成一个,从而让他的牛群变得更加时尚。一只奶牛的皮肤可以看成是一张 NNMM 列( 1N,M501 ≤ N, M ≤ 50 )的字符网格,如下所示:

................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

其中每个 X 表示斑点的一部分,如果两个 X 在横向或者纵向是相邻的,则它们属于同一个斑点(斜对角相邻不算),所以上述图形有刚好两个斑点。 FJ 牛群中的每只牛都有刚好两个斑点。

FJ 想要用尽可能少的颜料将两个斑点合并成一个。在上例中,他只需要用额外三个字符 X 就可以实现(下图中新字符用 * 标识出来,这样更直观)。

................
..XXXX....XXX...
...XXXX*...XX...
.XXXX..**..XXX..
........XXXXX...
.........XXX....

请帮助 FJ 计算出为了将两个斑点合并成一个更大的斑点,最少需要使用多少 X

输入格式(文件名:pageant.in)

11 行:两个用空格隔开的整数 NNMM

21+N2 \dots 1 + N 行:每行包含一个由 X. 组成的长为 MM 的字符串,表示奶牛的皮肤图案的一行。

输出格式(文件名:pageant.out)

11 行:为了将两个斑点和并成一个需要使用的新 X 的最少数量。

输入样例

6 16
................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

输出样例

3

样例解释

输入中的图案展示了奶牛皮肤上的两个独立的斑点,在下图中用 12 标识出来:

................
..1111....222...
...1111....22...
.1111......222..
........22222...
.........222....

三个 X 足以将两个斑点合并成一个:

................
..1111....222...
...1111X...22...
.1111..XX..222..
........22222...
.........222....