CodeForces 1105D 嵌套BFS

题意

- 给我们一个n*m的阵列,一个格子如果是#则为障碍,若为.则为空,若为数字,则代表这个格子属于该数字代表的玩家。


- 给我们每个玩家(不到十个)的“扩张速度”,比如扩张速度为2就代表,在一回合内,该玩家可将任何与被他拥有的格子的哈密顿距离小于等于2的格子据为己有


- 每个回合按照玩家序号从小到大来扩张,只能扩张空格子,并且不能跳过格子扩张,只能“延伸”, 求最终每个玩家占领的格子数。

思路

显然是模拟跑一边bfs就行,每次将所有属于这个点的格子全部pop并且push到另一个队列里,然后在这个队列进行bfs,扩张\(q_i\) 步终止,将新扩展到的格子加入原队列,但是要注意的是

  1. 初始状态下,每个玩家可能不止拥有一个格子
  2. 每次搜的时候必须将所有要搜的点加入子队列,不能一个个搜,否则可能出现“挡路”情况而使后面的格子不能扩展。

AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std; int n, m, q;
char ss[1005][1005];
long long aa[15];
int anss[15] = {0};
int ds[2][4] = {{0, 1, 0, -1}, {1, 0, -1, 0}};
struct ab
{
int xx;
int yy;
int st;
};
vector<struct ab>aq[15];
queue<struct ab> qq; void bfs2()
{
struct ab start = qq.front();
queue<struct ab> q;
int s = start.st;
int c = ss[start.yy][start.xx] - '0';
while (ss[start.yy][start.xx] - '0' == c)
{
q.push(start);
qq.pop();
if (qq.empty())
{
break;
}
start = qq.front();
}
while (!q.empty())
{
start = q.front();
q.pop();
if (start.st - s == aa[c])
{
break;
}
int xxx = start.xx;
int yyy = start.yy;
for (int i = 0; i < 4; ++i)
{
if (yyy + ds[0][i] >= 1 && yyy + ds[0][i] <= n && xxx + ds[1][i] <= m && xxx + ds[1][i] >= 1 && ss[yyy + ds[0][i]][xxx + ds[1][i]] == '.')
{
struct ab dd;
dd.xx = xxx + ds[1][i];
dd.yy = yyy + ds[0][i];
dd.st = start.st + 1;
ss[yyy + ds[0][i]][xxx + ds[1][i]] = c + '0';
q.push(dd);
if (dd.st - s == aa[c])
{
qq.push(dd);
}
++anss[c];
}
}
}
} int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= q; ++i)
{
scanf("%lld", &aa[i]);
}
for (int i = 1; i <= n; ++i)
{
scanf("%s", ss[i] + 1);
for (int j = 1; j <= m; ++j)
{
if (ss[i][j] >= '0' && ss[i][j] <= '9')
{
aq[ss[i][j] - '0'].push_back((struct ab){j, i, 0});
++anss[ss[i][j] - '0'];
}
}
}
for (int i = 1; i <= q; ++i)
{
for (int j = 0; j < aq[i].size(); ++j)
{
qq.push(aq[i][j]);
}
}
while (!qq.empty())
{
bfs2();
}
for (int i = 1; i < q; ++i)
{
printf("%d ", anss[i]);
}
if (q)
{
printf("%d\n", anss[q]);
}
return 0;
}

CodeForces 1105D 嵌套BFS的更多相关文章

  1. 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 ...

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

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

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

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

  4. Codeforces 1105D (BFS)

    题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\) ...

  5. Codeforces 1105D(Kilani and the Game,双队列bfs)

    AC代码: #include<bits/stdc++.h> #define ll long long #define endl '\n' #define mem(a,b) memset(a ...

  6. CodeForces - 1105D Kilani and the Game(多源BFS+暴力)

    题目: 给出一张游戏地图和每个玩家的位置,每次能移动的步数.p个玩家轮流移动占领地图中的格子(当格子已经被占领时就不能在占领了)在每个玩家都不能移动时游戏结束. 问在游戏结束后,每个玩家占领的格子的数 ...

  7. Amr and Chemistry CodeForces 558C(BFS)

    http://codeforces.com/problemset/problem/558/C 分析:将每一个数在给定范围内(10^5)可变成的数(*2或者/2)都按照广搜的方式生成访问一遍,标记上访问 ...

  8. [Codeforces 1037D] Valid BFS?

    [题目链接] http://codeforces.com/problemset/problem/1037/D [算法] 首先求出每个点的父节点 , 每棵子树的大小 然后判断BFS序是否合法即可 时间复 ...

  9. [codeforces 1037D] Valid BFS? 解题报告(验证bfs序,思维题)

    题目链接:http://codeforces.com/problemset/problem/1037/D 题目大意: 给出一棵树,询问一个序列是否可能为这棵树从节点1开始遍历的bfs序 题解: 对于每 ...

  10. CodeForces CF877D题解(BFS+STL-set)

    解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...

随机推荐

  1. sql分组后排序计算

    用法:RANK() OVER(PARTITION BY 分组字段 ORDER BY 排序字段 ) 例子:要得到n4列 ---创建测试数据create table tb(n1 varchar2(40) ...

  2. Chapter 6. Build Script Basics

    Chapter 6. Build Script Basics 6.1. Projects and tasks Everything in Gradle sits on top of two basic ...

  3. MySQL的sql_mode设置导致报错1292

    在MySQL8.0的一个PXC集群中,默认的sql_mode设置如下: select @@sql_mode; +-------------------------------------------- ...

  4. IDEA工具第一篇:细节使用-习惯设置

    安装好Idea后,直接上手clone代码进入编码时代,有没有那么一刻你会觉用起来没有那么顺手流畅呢? 下面是关于 [Windows] 下安装idea的一些习惯设置[ Mac大致一样 ] 一.修改系统文 ...

  5. 低代码平台探讨-MetaStore元数据缓存

    背景及需求 之前提到我们模型驱动的实现选择的是解释型,需要模型的元数据信息,在接到请求后动态处理逻辑. 此外,应用的通用能力中还包括:页面dsl查询,菜单查询等. 而且后期加入触发器,用户自定义api ...

  6. RLChina2022公开课-博弈论

    纯博弈: 单纯的动机组合,离散的集合 混合博弈: 加入了概率论,以百分比的概率执行不同的的动机.,概率分布 零和博弈.合作博弈.协同博弈 扩展博弈和非完美信息 扩展博弈.贝叶斯博弈 纳什均衡 任何一位 ...

  7. VM虚拟机在添加虚拟硬盘后无法boot的解决方案

    今天本想自己配一个mini Linux系统,但是在给系统增加一块硬盘的时候,发现出现以下问题 CentOS打不开(其实经过很久也能进去,但是指令全部失效) 由于不知道原因最后就重装了系统,奇怪的是,重 ...

  8. 21. 从零用Rust编写正反向代理,tokio竟然这样对待socket!

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  9. JVM-Java语法糖与Java编译器

    基本类型和其包装类型之间的自动转换,也就是自动装箱.自动拆箱,是通过加入[Wrapper].valueOf(如 Integer.valueOf)以及[Wrapper].[primitive]Value ...

  10. 简单理解cookie/session机制(转)

    http://www.woshipm.com/pd/864133.html cookie与session应用于互联网中的一项基本技术--会话(用户与客户端的交互)跟踪技术,用来跟踪用户的整个会话.简单 ...