The Separator in Grid_BFS
Description
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
A test case of N = 0 and M = 0 indicates the end of input, and should not be processed.
Output
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的更多相关文章
- UITableViewCell里面separator的设置
最近cell显示的时候左边一直有15个像素的偏移,查了下面的方法 //1. 不管用 [self.tableView setSeparatorInset:UIEdgeInsetsZero]; // 2. ...
- ios7 ios8 cell中下划线偏移(separator Insets)处理方法
在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...
- java.io.File中的pathSeparator与separator的差异
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指";&q ...
- oc TableView 分割线(separator)部分显示问题
问题:当TableView的cell不能显示完整个屏幕(屏幕有剩余),则没有显示cell的地方也会显示分割线,这不是我们想要的,正常情况下,如果没有cell则应没有分割线.如下图所示:左图为遇到问题, ...
- UITableViewCell的separator分隔线设置失效
// 处理separator -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSe ...
- 如何更改tableView cell的accessoryView位置,如何让首尾的Separator不显示
一,如何更改tableView cell的accessoryView位置 1.实则是更改不了的,因此右边总会有一个小边距. 2.可以向 cell 的 contentView 中添加按钮放在右边,与 c ...
- [ASM C/C++] C makefile:2: *** missing separator. Stop. 问题
在利用make编译代码时,makefile文件的目标代码前面要用tab而不能用空格来代替. 要不然就会提示: makefile:2: *** missing separator. Stop. 要注意 ...
- 千份位Javascript Thousand Separator / string format
function Separator(str){ return str.split(/(\d+)(\d{3})(\d{3})(\d{3})(\d{3})/).join(',').replace(/^, ...
- 关于Java的File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
随机推荐
- Java 基础知识点(必知必会其二)
1.如何将数字输出为每三位逗号分隔的格式,例如“1,234,467”? package com.Gxjun.problem; import java.text.DecimalFormat; impor ...
- java.util 类 TreeSet<E>
java.lang.Object≥ java.util.AbstractCollection<E> ≥ java.util.AbstractSet<E> ≥ java.util ...
- 生产订单修改删除组件BDC
可用函数修改:CO_XT_COMPONENT_CHANGE,一次一个 FORM prm_change_bom . DATA:gw_zstypf TYPE zstypf. DATA:lv_rspos T ...
- PHP 单引号和双引号的区别
$a = 'jfdjaff';$b = '234125';$c = '"jj $a $b"'.PHP_EOL;echo $c;$c = 'jj $a $b'.PHP_EOL;ech ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- mysql 游标取值为空的问题
DELIMITER $$ DROP PROCEDURE IF EXISTS updatePic $$ CREATE PROCEDURE updatePic() BEGIN DECLARE cover_ ...
- POJ 3660
233333... Description: 就是说呢.牛是的实力室友大小之分的.然后呢.告诉你很多pair 表示任意两头牛之间的实力大小.按实力排序之后.问你一共有多少只牛的排名是确定了的. T_T ...
- php不解析的排查步骤
php不解析的排查步骤:1. /usr/local/apache2/bin/apachectl -M 看一下有没有加载libphp5.so2. 查看配置文件中是否有 AddType applicati ...
- Windows安装配置php+memcached的方法
Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...
- 二模 (6) day1
第一题: 设 S(N)表示 N 的各位数字之和,如 S(484)=4+8+4=16,S(22)=2+2=4.如果一个正整数 x满足 S(x*x)=S(x)*S(x),我们称 x 为 Rabbit Nu ...