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)/[( ...
随机推荐
- [转]8 Regular Expressions You Should Know
Regular expressions are a language of their own. When you learn a new programming language, they're ...
- C# 语言规范_版本5.0 (第14章 枚举)
1. 枚举 枚举类型 (enum type) 是一种独特的值类型(第 4.1 节),它用于声明一组命名的常量. 下面的示例 enum Color { Red, Green, Blue } 声明一个名为 ...
- Recursive - leetcode [递归]
经验tips: Recursion is the best friend of tree-related problems. 一是只要遇到字符串的子序列或配准问题首先考虑动态规划DP,二是只要遇到需要 ...
- emmet 教程 emmet快捷键大全
Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...
- 2.1 IDEA
1.背景:IntelliJ IDEA 比 Eclipse 更好http://www.oschina.net/news/26929/why-intellij-is-better-than-eclipse ...
- 激活JetBrains PhpStorm 2016.3.2和JetBrains WebStorm 2016.3.2
1.打开 phpstorm 2.在激活界面选择license server 在线激活方式 输入:http://idea.imsxm.com/ 3.激活成功,打开使用
- QT枚举类型与字符串类型相互转换
在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...
- HDU2571 命运 动态规划
好久没更新博客了. 校内练习的一道水题 HDU2571 命运. 简单DP. 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫 ...
- Android Studio Gradle project refresh failed No such property classpath for class
新建的一个 android 项目居然发现不能运行,gradle 无法启动,奇怪: Gradle 'Meitian' project refresh failed: No such p ...
- 第八十九节,html5+css3pc端固定布局,热门旅游取,标题介绍区,旅游项目区
html5+css3pc端固定布局,热门旅游取,标题介绍区,旅游项目区 样式: html代码: <!--主体--> <section class="zhu-ti" ...