#P2056. The Separator in Grid

The Separator in Grid

描述

给定一个连通的无向图 G=(V,E)G = (V, E),其中 VV 是顶点集,表示一组节点,EE 是边集,每条边连接 VV 中的两个节点。如果顶点子集 SS 的移除使得剩余的图有两个连通分量,则称 SS 为一个分隔符。我们用 [S,W,B][S, W, B] 来表示这个划分,其中移除分隔符 SS 后,剩余的图有两个连通分量 WWBB

在这个问题中,我们考虑网格中的分隔符。网格中的每个节点都与它的八个邻居(如果存在)相连。在图1中,我们展示了6x6网格的一个划分,其中有一个9点分隔符(图中的灰色节点)。分隔符左侧的节点属于集合 WW(白色节点),右侧的节点属于集合 BB(黑色节点)。

为了简化问题,你可以假设这个问题中提到的所有分隔符都满足以下限制:

  1. 它是一个最小分隔符。如果一个分隔符的任何子集都不是分隔符,则称这个分隔符是最小的。

  2. 它从网格的顶行的一个节点开始(除了角落,即图中的30和35),并在网格的底行的一个节点结束(除了角落,即图中的0和5)。

  3. 在从顶部到底部的路径上,它可以向左、向右或向下移动,但不能向上移动。

现在我们描述了一种方法来改进网格上的给定划分,通过这种方法我们可以减少分隔符中的节点数量。这个方法包含两个步骤:

  1. BB 中选择一些节点并添加到 SS 中。任何被选择的节点都必须有一个左邻居在 SS 中。

  2. SS 中移除一些节点(不包括前一步中添加的节点),并将它们添加到 WW 中。

在改进之后,我们应确保 SS 仍然是一个分隔符,并使 SS 中的节点数量尽可能少。对于图1,我们应该将14和20添加到 SS 中,并从 SS 中移除7、13、19和25。之后,我们得到一个新的划分,其分隔符包含7个点,如图2所示。

你的任务是,给定网格上的一个划分,确定改进后分隔符中节点的最少数量。

输入

有多个测试用例。每个用例以一行包含两个整数 NNMM3M,N2003 \leq M, N \leq 200)开始。在接下来的 NN 行中,每行有 MM 个字符,描述了 M×NM \times N 网格的初始划分。每个字符是 'S'、'W' 或 'B'。已知每个行中至少包含一个 'S'、一个 'W' 和一个 'B',且 'W' 总是位于 'S' 的左侧。

一个测试用例 N=0N = 0M=0M = 0 表示输入结束,不应被处理。

输出

对于每个测试用例,你应该输出一行,包含一个整数,表示改进后分隔符中节点的最少数量。

输入数据 1

6 6  
WWSBBB  
WSSBBB  
WSBBBB  
WSBBBB  
WSSSBB  
WWWSBB  
0 0

输出数据 1

7

来源

北京2004