zstu 4215 多起点bfs
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的更多相关文章
- HDU - 2612 Find a way 双起点bfs(路径可重叠:两个队列分别跑)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- FZU2150 :Fire Game (双起点BFS)
传送门:点我 题意:“#”是草,"."是墙,询问能不能点燃俩地方,即点燃俩“#”,把所有的草烧完,如果可以,那么输出最小需要的时间,如果不行输出-1 思路:暴力BFS,看到n和m都 ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- 【USACO 2.4】Overfencing(bfs最短路)
H行W列的迷宫,用2*H+1行的字符串表示,每行最多有2*W+1个字符,省略每行后面的空格.迷宫的边界上有且仅有两个出口,求每个点出发到出口的最短路. +-+-+-+-+-+ | | +-+ +-+ ...
- HDU 4634 Swipe Bo 状态压缩+BFS最短路
将起始点.终点和钥匙统一编号,预处理: 1.起始点到所有钥匙+终点的最短路 2.所有钥匙之间两两的最短路 3.所有钥匙到终点的最短路 将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意 ...
- codeforces 590C C. Three States(bfs+连通块之间的最短距离)
题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...
- 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,其 ...
- 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 ...
- Codeforces.788C.The Great Mixing(bitset DP / BFS)
题目链接 \(Description\) 有k种饮料,浓度Ai给出,求用最少的体积配成n/1000浓度的饮料. \(Solution\) 根据题意有方程 (A1x1+A2x2+...+Anxn)/[( ...
随机推荐
- 【实验室笔记】serialport的readline()方法
在最近的小项目中,单片机中断优先级的问题,串口发送到上位机的数据有时会出现发送的数据被中断打断的问题. 于是,在上位机机上就容易出现错误,原来读取的方法是read()的方法,反复修改发送数据的格式依然 ...
- 使用SyncToy 同步两台机器上的文件夹
@echo off echo 准备启动同步... net use \\WIN-AJH8QENQQGK "123456" /user:Administrator Z:\SyncToy ...
- HDU 1079 Calendar Game 博弈
题目大意:从1900年1月1日 - 2001年11月4日间选择一天为起点,两个人依次进行两种操作中的任意一种,当某人操作后为2001年11月4日时,该人获胜.问先手是否获胜 操作1:向后移一天 操作2 ...
- winsock编程IOCP模型实现代码
winsock编程IOCP模型实现代码 话不多说,上代码.借鉴<windows核心编程>部分源码和CSDN小猪部分代码. stdafx.h依赖头文件: #include <iostr ...
- Linux下SVN的简单配置
1.安装svn sudo yum install subversion 2.查看是否安装成功 svnserve --version 3.创建svn目录 svnadmin create 目录名 例如:s ...
- android studio genymotion插件
下载andriod studio 2.2 正式版,我的版本带SDK,一直安装, 1.在设置SDK的位置. 2.安装好后在安装虚拟机插件,genymotion去官网下载不带虚拟机的. 下载地址https ...
- .NET架构师
闲话不多扯,关于.NET架构师的培训 架构师的知识体系总结:7大重点,对7大重点作为细节的阐述将再后面陆续展开!架构师的体系纲领主要来着这7点.(必须严格记下) 1:现代软件开发过程及架构策略 1. ...
- bootstrip 折叠菜单
body { font-family: "宋体"; font-size: 12px } .menu { height: 30px; background: #e6e6e6; mar ...
- 第三章 Netty入门应用
3.1 Netty开发环境的搭建 3.1.1 下载Netty的软件包 3.1.2 搭建Netty应用工程 3.2 Netty服务端开发 3.3 Netty客户端开发 3.4 运行和调试 3.4.1 服 ...
- JEMETER 录制
两种方式: 第一种:badboy工具录制,导入jemeter脚本,导入jemeter.目测支持IE 第二种:代理服务器的方式 1.