Description

Given a connected, undirected graph G = (V, E), where V is the vertex set consisting a collection of nodes, and E is the set of edges, each of which connects two nodes from V. A vertex subset S is a separator if the subgraph induced by the vertices in V, but not in S, has two connected components. We shall use the notation [S, W, B] to represent the partition, where the removal of the separator S will give two connected components W and B.

In this problem, we consider the separators in grids. Each node in a grid is connected to its eight neighbors (if they exist). In Figure-1, we illustrate a partition of a 6*6 grid with a 9-point separator (gray nodes in the figure). The nodes on the left of the separator are in set W (white nodes), and the nodes on the right of the separator are in set B (black nodes). 

To simplify the problem, you can assume that all the separators referred in this problem satisfy the following restrictions: 
1) It’s a minimal separator. A separator is minimal if no subset of it forms a separator. 
2) It begins from a node on the top line of the grid, except the corner (i.e. 30 and 35 in the figures), and ends with a node on the bottom line of the grid, also except the corner (i.e. 0 and 5 in the figures). 
3) On its way from top to bottom, it can go left, right or down, but never go up.

Now we describe a method to improve a given partition on a grid, through which we can reduce the number of nodes in the separator. This method contains two steps: 
1) Select several nodes from B and add them into S. Any of the selected nodes must have a left neighbor which is in S. 
2) Remove several nodes from S (excluding the nodes added in the former step), and add them into W.

After the improvement, we should ensure S is still a separator, and make the number of nodes in S as small as possible. As for Figure-1, we should add 14 and 20 into S, and remove 7, 13, 19 and 25 from S. After that, we obtain a new partition with a 7-point separator shown in Figure-2.

Your task is, given a partition on a grid, to determine the least number of nodes in the separator after the improvement.

Input

There are several test cases. Each case begins with a line containing two integers, N and M (3 <= M, N <= 200). In each of the following N lines, there are M characters, describing the initial partition of the M*N grid. Every character is 'S', 'W' or 'B'. It is confirmed that each of these three characters appears at least once in each line, and 'W's are always on the left of 'S's.

A test case of N = 0 and M = 0 indicates the end of input, and should not be processed.

Output

For each test case, you should output one line containing one integer, which is the least number of nodes in the separator after the improvement.

Sample Input

6 6
WWSBBB
WSSBBB
WSBBBB
WSBBBB
WSSSBB
WWWSBB
0 0

Sample Output

7

【题意】给出一个n*m的矩阵,包含w,s,b,s是分界线,每行每种都至少有一个,B在他的左边是S时能变成S,S无条件可以变成w,求最少的分界线s

【思路】先把能变成S的B全部变成s,然后进行BFS从第一行的S开始,把(0,s)(0,s+1)入队,进行三个方向的搜索下、左、右

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
const int inf=0x7777777;
const int N=;
int n,m,ans,s;
char mp[N][N];
int vis[N][N];
int di[][]={,,,,,-};//以左上角为原点,下,右,左开始搜索
struct node
{
int x,y;
int step;
};
bool go(int x,int y)
{
if(x<||x>n-||y<||y>m-) return false;
else return true;
}
void bfs()
{
memset(vis,,sizeof(vis));
queue<node>qu;
node pre,next;
pre.x=,pre.y=s;
pre.step=;
qu.push(pre);
vis[][s]=;
if(s+<m-)
{
pre.x=;pre.y=s+;
pre.step=;
qu.push(pre);
vis[][s+]=;
}
while(!qu.empty())
{
pre=qu.front();
qu.pop();
if(pre.x==n-&&pre.y>&&pre.y<m-)
{
ans=min(ans,pre.step);
}
for(int i=;i<;i++)
{
int xx=pre.x+di[i][];
int yy=pre.y+di[i][];
if(go(xx,yy)&&(!vis[xx][yy])&&mp[xx][yy]=='S')
{
next.x=xx;
next.y=yy;
next.step=pre.step+;
vis[xx][yy]=;
qu.push(next);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m),n||m)
{
for(int i=;i<n;i++)
{
scanf("%s",mp[i]);
int flag=;
for(int j=;j<m;j++)
{
if(mp[i][j]=='B'&&mp[i][j-]=='S'&&!flag)
{
mp[i][j]='S';
flag=;
}
}
}
for(int i=;i<m;i++)
{
if(mp[][i]=='S')
{
s=i;
break;
}
}
ans=inf;
bfs();
printf("%d\n",ans); }
return ;
}

The Separator in Grid_BFS的更多相关文章

  1. UITableViewCell里面separator的设置

    最近cell显示的时候左边一直有15个像素的偏移,查了下面的方法 //1. 不管用 [self.tableView setSeparatorInset:UIEdgeInsetsZero]; // 2. ...

  2. ios7 ios8 cell中下划线偏移(separator Insets)处理方法

    在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...

  3. java.io.File中的pathSeparator与separator的差异

    先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指";&q ...

  4. oc TableView 分割线(separator)部分显示问题

    问题:当TableView的cell不能显示完整个屏幕(屏幕有剩余),则没有显示cell的地方也会显示分割线,这不是我们想要的,正常情况下,如果没有cell则应没有分割线.如下图所示:左图为遇到问题, ...

  5. UITableViewCell的separator分隔线设置失效

    // 处理separator -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSe ...

  6. 如何更改tableView cell的accessoryView位置,如何让首尾的Separator不显示

    一,如何更改tableView cell的accessoryView位置 1.实则是更改不了的,因此右边总会有一个小边距. 2.可以向 cell 的 contentView 中添加按钮放在右边,与 c ...

  7. [ASM C/C++] C makefile:2: *** missing separator. Stop. 问题

    在利用make编译代码时,makefile文件的目标代码前面要用tab而不能用空格来代替. 要不然就会提示: makefile:2: *** missing separator.  Stop. 要注意 ...

  8. 千份位Javascript Thousand Separator / string format

    function Separator(str){ return str.split(/(\d+)(\d{3})(\d{3})(\d{3})(\d{3})/).join(',').replace(/^, ...

  9. 关于Java的File.separator

    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...

随机推荐

  1. 各种浏览器css hack

    转载 http://www.cnblogs.com/jikey/archive/2010/06/21/1761924.html IE都能识别*,标准浏览器(如FF)不能识别*:IE6能识别*,但不能识 ...

  2. 史上最全的 Java 新手问题汇总

    史上最全的 Java 新手问题汇总   Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...

  3. [转]网络时间的那些事及 ntpq 详解

    Gentoo(也许其他发行版也是?)中 "ntpq -p" 的 man page 只有简短的描述:“打印出该服务器已知的节点列表和它们的状态概要信息.” 我还没见到关于这个命令的说 ...

  4. 特征值提取之 -- TF-IDF值的简单介绍

    首先引用百度百科的话: "TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料 ...

  5. CentOS 常用命令大全(2)

    系统 # uname -a               # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue   # 查看操作系统版本 # cat /proc/cpuinf ...

  6. JMETER JDBC操作

    本文目标 1.添加测试计划 2.配置JDBC连接 3.插入数据 4.使用控制器 5.查看插入结果   1.添加测试计划 添加mysql驱动   2.添加测试计划 3.添加JDBC连接   在这里JDB ...

  7. 修改linux 文件权限命令 chmod

    [转载自:http://www.cnblogs.com/avril/archive/2010/03/23/1692809.html] Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以 ...

  8. HADOOP 2架构图

    HDFS 2 architecture YARN architecture

  9. P264练习题1.2题

    package 集合; import java.util.*; public class fourteen { public static void main(String[] args) { //1 ...

  10. Windows XP PRO SP3 - Full ROP calc shellcode

    /*     Shellcode: Windows XP PRO SP3 - Full ROP calc shellcode     Author: b33f (http://www.fuzzysec ...