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)/[( ...
随机推荐
- Chapter 17_3 table的默认值
对象属性 有很多情况需要把有些属性绑定到某个对象,例如:函数与其名称.table的默认值.数组大小等... 当对象是一个table时,可以通过适当的key将属性存储在这个table中. 如果对象不是一 ...
- 防范CSRF(一)
CSRF是跨网站伪造请求的缩写.大致的攻击流程是,黑客获得浏览器向服务器发送的请求,然后对请求进行修改,让服务器执行指定的操作. 防范方式可以使用微软提供的解决方案. View放置Html.AntiF ...
- 高一的我曾对自己说"要放慢脚步去生活"!?
看了高一的时候自己写的日记,瞬间被自己感动到了.以下是当时的几段感慨: 慢是一种放松.是生活的一种良好心态,喜欢这样放慢步伐地生活,那是一种享受! 但我们生活在一个快节奏的时代,我们总是被迫卷进那潮流 ...
- 【翻译】编译Cordova项目
针对iOS创建项目 需要安装iOS SDK才能创建Workshop项目 打开终端工具并使用cd命令进入workshop目录执行下面都命令 cordova build ios 项目建立在workshop ...
- 如何在高并发的分布式系统中产生UUID
一.数据库发号器 每一次都请求数据库,通过数据库的自增ID来获取全局唯一ID 对于小系统来说,这是一个简单有效的方案,不过也就不符合讨论情形中的高并发的场景. 首先,数据库自增ID需要锁表 而且,UU ...
- MySQL数据库传输BLOB类型数据丢失 解决办法
修改MySQL安装目录下my.ini文件配置:
- android从assets读取文件的方法
因为开发需要,经常要从工程的assets文件夹里面读取文件,现在贴一个方法以作记录: private void getFromAssets(String fileName, ArrayList< ...
- 《JavaScript高级程序设计》读书笔记 ---创建对象
虽然Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用工厂模式的一种变体. 工厂模式工厂 ...
- Zookeeper Watcher 解析
1.Watcher 接口源码 1. 当客户端向zookeeper注册了watcher时,当服务器向客户端发送一个watcher事件通知时,客户端会调用回调方法process(WatchedEvent ...
- 浅谈MacOS-20155205郝博雅
预备作业3:安装虚拟机 我的电脑是MacBook Air,因此按照娄老师说的,不需要安装Linix系统便能完成之后的学习.所以我就浅谈一下用MacOS系统的感受. 优点:人性化&便捷 与同系列 ...