AC代码:

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+;
const int maxn=1e5+;
struct node{
int x,y,t;
node(int xx,int yy,int tt){
x=xx;y=yy;t=tt;
}
};
int s[],vis[][];char a[][];
int n,m,k;
queue<node> q1[];
queue<node> q2[];
int dx[]={,,,-};
int dy[]={,-,,};
int bfs(int p){
int newx=;
while(!q2[p].empty()){
node x=q2[p].front();q2[p].pop();
x.t=;
q1[p].push(x);
}
while(!q1[p].empty()){
node x=q1[p].front();q1[p].pop();
if(x.t==s[p]){
q2[p].push(x);
continue;
}
for(int i=;i<;i++){
int xx=x.x+dx[i];
int yy=x.y+dy[i];
if(xx<||xx>n||yy<||yy>m||a[xx][yy]=='#'||vis[xx][yy]||x.t+>s[p]) continue;
newx+=;
q1[p].push(node(xx,yy,x.t+));
vis[xx][yy]=p;
}
}
if(newx>=) return ;
else return ;
}
int ans[];
int main(){
cin>>n>>m>>k;
for(int i=;i<=k;i++) cin>>s[i];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>a[i][j];
if(a[i][j]-''>=&&a[i][j]-''<=){
vis[i][j]=a[i][j]-'';
q2[a[i][j]-''].push(node(i,j,));
}
}
}
while(){
int flag=;
for(int i=;i<=;i++){
flag+=bfs(i);
}
if(flag==) break;
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
ans[vis[i][j]]+=;
}
}
for(int i=;i<=k;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}

题意:一个图,一群人,每个人有自己的速度。按顺序来占领空格子,有#的是墙。输出每个人占领的格子数量。速度的意思是从起点出发走一个格子需要1速度,走可以拐弯。轮到的时候占领的格子。其实也就是对于p每一次走的时候,曼哈顿距离<=s[p]的且未走过的可走点都算作是自己的。

思路:用bfs搭配结构体来做,挺考验代码功力的,q2队列是存对于p而言当前正在走且还未走到尽头的(即还可以走的)坐标以及离出发点的曼哈顿距离大小。q1队列存的是已经走到尽头的,即曼哈顿距离==s[p]的点,这个时候他们作为新的出发点,在这里一个一个将已走距离t更改为0。

有的时候,可能对于某个p,他可走的路被封死了,但是别的p还可以走,所以是:

while(还能走){
int 已走的距离=0;
for(int i=1;i<=k;i++){
已走的距离+=当前点i在该轮中走的距离;
}
如果已走的距离==0,意味着该轮大家都没有进展(即图满了),那么就结束了(说明大家都没的走了)
}

Codeforces 1105D(Kilani and the Game,双队列bfs)的更多相关文章

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

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

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

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

  3. codeforces 1064D 双端队列BFS

    双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...

  4. CH 2601 - 电路维修 - [双端队列BFS]

    题目链接:传送门 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致 ...

  5. CH2601 电路维修(双端队列bfs)建图恶心

    CH2601 电路维修 双端队列bfs,其实就是因为只有0和1所以可以直接2维护队列单调性(和优先队列一个道理) 建图的过程需要仔细斟酌(想一想id为什么这么写) 还有,空间要开够(很玄学),我一开始 ...

  6. Luogu P2243 电路维修 双端队列BFS

    当转移的代价是0和一个分明不同的权值时,可以用双端队列BFS去跑(你跑最短路也没问题..QWQ) 而对于这道题,边旋转代价是1,不旋转代价是0:可以直接建图最短路,也可以跑BFS 这个题建图很有意思: ...

  7. 电路维修 (广搜变形-双端队列bfs)

    # 2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On [题目描述] 有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会 ...

  8. 王霸雄图荣华敝屣,谈笑间尽归尘土|基于Python3双队列数据结构搭建股票/外汇交易匹配撮合系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_192 如果你爱他,那么送他去股市,因为那里是天堂:如果你恨他,送他去股市,因为那里是地狱. 在过去的一年里,新冠疫情持续冲击世界经 ...

  9. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

随机推荐

  1. Python爬虫---爬取腾讯动漫全站漫画

    目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...

  2. 二进制部署kubernetes集群_kube-apiserver提示"watch chan error: etcdserver: mvcc: required revision has been compacted'

    查看kube-apiserver状态 [root@yxz-cluster01 ~]# systemctl status kube-apiserver -l ● kube-apiserver.servi ...

  3. Java 中正则表达式使用

    正则表达式基本用法: 测试代码: @Test public void test01() { String str = "adsfd##4324"; // 创建正则表达式对象 Pat ...

  4. 记使用STL与unique_ptr造成的事故-段子类比

    最近由于业务需要在写内存池子时遇到了一个doule-free的问题.折腾半个晚上以为自己的眼睛花了.开始以为是编译器有问题(我也是够自信的),但是在windows下使用qtcreator vs2017 ...

  5. Winsock select server 与 client 示例代码

    参考 https://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5.html ...

  6. VirtualBox 原始镜像转换成 vdi 镜像

    VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘

  7. Enjoy the game

    这真的只是一道规律题 我找到规律了但是因为数据太大了我超时了 我们现在来看一下这道题 牛牛战队的三个队员在训练之余会自己口胡了一些题当做平时的益智游戏.有一天牛可乐想出了一个小游戏给另外两名队员玩,游 ...

  8. 使用VSCode连接到IBM Cloud区块链网络

    文章目录 从IBM Cloud控制面板导出连接信息 在VSCode中创建gateway和wallet 在VSCode中提交transaction 上篇文章我们讲到怎么在IBM Cloud搭建区块链环境 ...

  9. build.gradle 详解(一)

    简述: 1) Java 开发中有两个大名鼎鼎的项目构建 ANT.Maven. 2) Google 推荐使用的 Android studio 是采用 Gradle 来构建项目.Gradle 是一个非常先 ...

  10. Linux运维面试题:请简要说明Linux系统在目标板上的启动过程?

    Linux运维面试题:请简要说明Linux系统在目标板上的启动过程? 该问题是Linux运维面试最常见的问题之一,问题答案如下: 1.用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备( ...