http://codeforces.com/problemset/problem/1105/D

题意:有一片矩阵区域,一开始有多个势力比如1,2,3,4....9,从势力1开始轮流向外扩张,地图上为‘.’可以占领,‘#’则不能占领,被占领后不能再次被别人占领,只能上下左右扩张,每个势力有一个扩张速度,求最后整片区域上各个势力占了多少格子。

解题:

1.显然bfs,但是速度有大有小,多向bfs

2.输入的数据同一势力的起点可能不止一个(坑)

3.从势力1开始轮流扩张,不是队列一次走到头

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int n,m,p;
int last[];///上一次压入了多少个点
struct node
{
int x;
int y;
};
int s[];///速度
char a[][];
int vis[][];
int ans[];
int can[];///是否走投无路
queue<node>que[];
int d[][]={ {-,}, {,}, {,-}, {,} };///上下左右 void bfs()
{
for(int i=;i<=p;i++)///清空
{
while(!que[i].empty())
que[i].pop();
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if( a[i][j]!='.' && a[i][j]!='#' )
{
que[ a[i][j]-'' ].push( {i,j} );///压入起点,可能不止一个
vis[i][j]=a[i][j]-'';
last[ a[i][j]-'' ]++; }
}
}
bool flag=true;
while(flag)///有人还能延伸就继续
{
flag=false;
for(int idx=;idx<=p;idx++)///每个队列走一次
{
for(int ss=;ss<=s[idx] && can[idx]== ;ss++)///扩展速度,能走多少步,s[i]可能很大超时,用can数组截断
{
int num=last[idx];///本次允许弹出去扩张的节点的数量,即上次压入的节点数量
last[idx]=;///新一轮扩张加入的节点要清空
for(int t=;t<=num;t++)
{
node now=que[idx].front();
que[idx].pop();
ans[idx]++;///取队头,弹出的时候区域+1
for(int i=;i<;i++)
{
int xx=now.x+d[i][];
int yy=now.y+d[i][];
if( xx>= && xx<n && yy>= && yy<m && vis[xx][yy]== && a[xx][yy]=='.' )
{
que[idx].push( {xx,yy} );
vis[xx][yy]=idx;///压入队列,标记访问过
last[idx]++;///本次压入点的个数
}
} }
if(que[idx].empty())
can[idx]=idx;///走投无路,美德扩展了
}
}
for(int i=;i<=p;i++)
{
if(!que[i].empty())
flag=true;
}
}
for(int i=;i<=p;i++)
printf("%d ",ans[i]);
printf("\n");
} int main()///CF1105D
{
while(scanf("%d %d %d",&n,&m,&p)!=EOF)
{
memset(a,,sizeof(a));
memset(s,,sizeof(s));
memset(ans,,sizeof(ans));
memset(vis,,sizeof(vis));
memset(last,,sizeof(last));
memset(can,,sizeof(can));
for(int i=;i<=p;i++)///速度
scanf("%d",&s[i]);
getchar();
for(int i=;i<n;i++)///地图
scanf("%s",a[i]); bfs();
}
return ;
}

CF1105D-Kilani and the Game-(多向bfs)的更多相关文章

  1. Codeforces 1105D Kilani and the Game【BFS】

    <题目链接> 题目大意: 每个玩家控制一个颜色去扩张,每个颜色的扩张有自己的速度,一个颜色跑完再跑下一种颜色.在所有颜色不能在继续扩张的时候停止游戏.询问此时各种颜色的数量. 解题分析: ...

  2. [CF1105D]Kilani and the Game

    题目大意:给出一个$n\times m(n,m\leqslant10^3)$的地图,有$k(k\leqslant9)$个玩家,第$i$个玩家速度为$s_i$.地图中$\#$代表障碍:$.$ 代表空地: ...

  3. Codeforces Round #533 (Div. 2) D. Kilani and the Game(BFS)

    题目链接:https://codeforces.com/contest/1105/problem/D 题意:p 个人在 n * m 的地图上扩展自己的城堡范围,每次最多走 a_i 步(曼哈顿距离),按 ...

  4. hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  5. D. Kilani and the Game 解析(裸BFS、實作)

    Codeforce 1105 D. Kilani and the Game 解析(裸BFS.實作) 今天我們來看看CF1105D 題目連結 題目 給一個\(n\times m\)的地圖,地圖上有幾種格 ...

  6. Kilani and the Game CodeForces - 1105D (bfs)

    Kilani is playing a game with his friends. This game can be represented as a grid of size n×mn×m, wh ...

  7. Codeforces H. Kilani and the Game(多源BFS)

    题目描述: Kilani and the Game time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. D. Kilani and the Game(多源BFS)

    题目来源:http://codeforces.com/contest/1105/problem/D 题意:编号为1-k的点在一张n*m的表格中依次扩散,每个结点有各自的扩散速度且只可以往上下左右四个方 ...

  9. Kilani and the Game CodeForces - 1105D (bfs)

    沙茶bfs打了2小时... queue入队量太大了, 放函数里直接T了, 改成全局46ms #include <iostream> #include <algorithm> # ...

随机推荐

  1. KAFKA 节点配置问题

    -- ::, INFO o.a.j.e.StandardJMeterEngine: Running the test! -- ::, INFO o.a.j.s.SampleEvent: List of ...

  2. golang --- map如何判断key是否存在

    判断方式为value,ok := map[key], ok为true则存在 package main import "fmt" func main() { demo := map[ ...

  3. python操作jenkins、python-jenkins api

    Jenkins作为最流行的自动化流程的核心工具,我们使用它自带的web-ui完全可以满足日常的构建及发布工作,但是如果需要和其他系统做集成就必须二次开发或者通过API方式进行交互了. Jenkins介 ...

  4. ftp搭建后外网无法连接和访问阿里云服务器(非软件)

    阿里云服务器由于性价比高,是不少企业建站朋友们的首选.而在购买阿里云服务器后,不少客户反映其在搭建FTP后出现外网无法访问的问题,这里特意搜集整理了关于ftp搭建后外网无法连接和访问的问题,提供以下解 ...

  5. 一文搞懂 Flink 网络流控与反压机制

    https://www.jianshu.com/p/2779e73abcb8 看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flin ...

  6. Linux环境下:vmware安装Windows报错误-无人参与应答文件包含的产品密钥无效

    最近在安装window server 2012 R2的时候,输入好密钥可以继续安装,但在后面又提示我“无人参与应答文件包含的产品密钥无效.删除无效的密钥或在无人参与应答文件中提供有效的产品密钥继续进行 ...

  7. 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,如果需要往一 ...

  8. Python列表,元组,字典,集合

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. 列表追加数据的方法:append(),extend(数组),insert(位 ...

  9. python3常用的内置函数

    数学相关 abs(a) : 求取绝对值.abs(-1) max(list) : 求取list最大值.max([1,2,3]) min(list) : 求取list最小值.min([1,2,3]) su ...

  10. 数据结构与算法5—KMP算法

    串的模式匹配算法 子串(模式串)的定位操作通常称为串的模式匹配. 这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项. 串的顺序存储实现 #include<s ...