input

n m   1<=n,m<=1000

n*m的地图,全为大写字母

7 10
WWWWWCCDEW
WWWWCCEEEW
WTWWWCCCCW
WWFFFFFFWW
WWFAAAAFWW
WWFABCAFFW
WWFAAAAFWW
output
从W到每种字母跨过最少的其它字母个数,如从W到A只跨过一种字母F
A 1
B 2
C 0
D 1
E 0
F 0
T 0
做法:把每个W的连通块当成起点依次进队进行bfs
 #include <bits/stdc++.h>
#define MAX 1000000
#define LL long long
using namespace std;
int cas=,T,n,m,v[][],idn,mind[],idp[MAX+][];//idp表示连通块起点
char s[][],id[MAX+];
int vis[MAX+];
void dfs(int x,int y,char& c,int &id)//连通块标id
{
if(x>=n||y>=m||x<||y<||v[x][y]!=-||s[x][y]!=c) return;
v[x][y]=id;
dfs(x+,y,c,id);
dfs(x-,y,c,id);
dfs(x,y+,c,id);
dfs(x,y-,c,id);
dfs(x+,y+,c,id);
dfs(x-,y-,c,id);
dfs(x+,y-,c,id);
dfs(x-,y+,c,id);
}
queue<int>q[];
void dfs(int x,int y,int &k,int d)//查找相邻接的连通块
{
if(x<||y<||x>=n||y>=m) return;
if(v[x][y]!=k) { q[d].push(v[x][y]);return; }//入队列
if(!s[x][y]) return;
s[x][y]=;
dfs(x+,y,k,d);
dfs(x-,y,k,d);
dfs(x,y+,k,d);
dfs(x,y-,k,d);
dfs(x+,y+,k,d);
dfs(x-,y-,k,d);
dfs(x+,y-,k,d);
dfs(x-,y+,k,d);
}
void bfs()
{
memset(vis,-,sizeof(vis));
int d=,step=;
while(!q[].empty()) q[].pop();
while(!q[].empty()) q[].pop();
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(s[i][j]&&s[i][j]=='W') { dfs(i,j,v[i][j],d);vis[v[i][j]]=; }
while(!q[d].empty())//两个队列bfs,一个队列是一步
{
while(!q[d].empty())
{
int u=q[d].front();q[d].pop();
if(vis[u]!=-) continue; //标记
dfs(idp[u][],idp[u][],u,d^);
vis[u]=step;
}
step++;
d^=;
}
// for(int i=0;i<idn;i++) printf("%d %c %d\n",i,id[i],vis[i]);
}
void process()
{
idn=;
for(int i=;i<n;i++) //给每个连通块标>=0的id
for(int j=;j<m;j++)
if(v[i][j]==-) { dfs(i,j,s[i][j],idn);idp[idn][]=i;idp[idn][]=j;id[idn++]=s[i][j]; }
// for(int i=0;i<n;i++,printf("\n")) for(int j=0;j<m;j++) printf("%02d ",v[i][j]);
}
int main()
{
// freopen("in","r",stdin);
//scanf("%d",&T);
while(scanf("%d%d",&n,&m)==)
{
for(int i=;i<n;i++) { scanf("%s",s[i]);memset(v[i],-,sizeof(int)*m); } //input
process();
bfs();
for(int i=;i<;i++) mind[i]=MAX; //查找每个大写字母的最小值
for(int i=;i<idn;i++) mind[id[i]-'A']=min(mind[id[i]-'A'],vis[i]);
for(int i=;i<;i++) if(mind[i]&&mind[i]<MAX) printf("%c %d\n",i+'A',mind[i]-);
}
//printf("time=%.3lf\n",(double)clock()/CLOCKS_PER_SEC);
return ;
}
/**************************************************************
Problem: 4215
User: 15xss282
Language: C++
Result: Accepted
Time:364 ms
Memory:21028 kb
****************************************************************/

zstu 4215 多起点bfs的更多相关文章

  1. HDU - 2612 Find a way 双起点bfs(路径可重叠:两个队列分别跑)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. FZU2150 :Fire Game (双起点BFS)

    传送门:点我 题意:“#”是草,"."是墙,询问能不能点燃俩地方,即点燃俩“#”,把所有的草烧完,如果可以,那么输出最小需要的时间,如果不行输出-1 思路:暴力BFS,看到n和m都 ...

  3. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

  4. 【USACO 2.4】Overfencing(bfs最短路)

    H行W列的迷宫,用2*H+1行的字符串表示,每行最多有2*W+1个字符,省略每行后面的空格.迷宫的边界上有且仅有两个出口,求每个点出发到出口的最短路. +-+-+-+-+-+ | | +-+ +-+ ...

  5. HDU 4634 Swipe Bo 状态压缩+BFS最短路

    将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...

  6. codeforces 590C C. Three States(bfs+连通块之间的最短距离)

    题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...

  7. 2501 矩阵距离 (bfs)

    描述 给定一个N行M列的01矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i-k|+|j-l| 输出一个N行M列的整数矩阵B,其 ...

  8. BZOJ3417[Poi2013]Tales of seafaring——BFS

    题目描述 Young Bytensson loves to hang out in the port tavern, where he often listens to the sea dogs te ...

  9. Codeforces.788C.The Great Mixing(bitset DP / BFS)

    题目链接 \(Description\) 有k种饮料,浓度Ai给出,求用最少的体积配成n/1000浓度的饮料. \(Solution\) 根据题意有方程 (A1x1+A2x2+...+Anxn)/[( ...

随机推荐

  1. C/C++-style输入输出函数

    C风格的输入输出 (1) int getchar() 与 int putchar(int c) getchar从stdin输入流中读取字符,每次只能读取一个字符.若想一次性读取多个字符,则可将其放入循 ...

  2. CC版本添加 LUCI

    BB版本的时候,在 feeds/luci/contrib/package/luci下的Makefile文件添加上需要编译的 luci-application即可. 在CC版里改为:Feeds/luci ...

  3. 【转】delphi 保存到txt文件

    procedure TForm1.btn1Click(Sender: TObject); var astr: string; sList: TStrings; path: string; begin ...

  4. 修改LibreOffice Draw中定义的样式名称

    目前我使用的是LibreOffice 4.2.4.2.经过以往的测试和使用经验,这是诸多版本中较为稳定和bug相对较少的.今天无意中发现该版本的LibreOffice Draw存在一个问题:样式名称修 ...

  5. group by 和count 联合使用问题

    工作中要根据用户发布的产品数量来排序做分页,使用group by uid 用count(uid) 来统计的数量和想要的数量不正确. count统计的数量是被group by 分组以后每一组中数据的数量 ...

  6. 【实验室笔记】C#的Socket客户端接收和发送数据

    采用socket发送和接收数据的实验中,服务器采用的是网络助手作为模拟服务器端. 客户端程序流程: 应用的命名空间: using System.Net; using System.Net.Socket ...

  7. c# 索引器方法

    索引器方法允许我们构建能够以类似访问数组的语法来访问内部子类型的自定义类型 在语法上索引器方法和属性的定义很类似,一样是使用get,set,不同的是索引器是使用this[]创建的. 一个简单的索引器代 ...

  8. Installation LEK Cluster

    The structure of cluster like this: We used four VM: A  10.32.xxx.213   ubuntu12.04 B  10.32.xxx.214 ...

  9. C1FlexGrid小结(转自http://www.cnblogs.com/C1SupportTeam/archive/2012/12/11/2812316.html)

    C1FlexGrid控件来对一个表格格式中的数据进行显示,编辑,组和总结.该表格可以绑定到一个数据源,它可以对自己的数据进行管理. C1FlexGrid控件有一个包含以下元素的丰富的对象模型: 以下的 ...

  10. Delphi @ # $ 特殊字符含义

      ^: 指针   @: 取址  #: 十进制符   $: 十六进制符