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. 使用User Agent和代理IP隐藏身份

    一.为何要设置User Agent 有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的 ...

  2. Java中的匿名对象代码实例

    /* 匿名对象:就是没有名字的对象. 匿名对象的应用场景: A:调用场景,仅仅只调用一次的时候. 注意:调用多次的时候,不合适. 那么,这种匿名调用有什么好处吗? 有,匿名对象调用完毕就是垃圾.可以被 ...

  3. jdbc-手写Java方法连接数据库

    一.关键四元素   ①    com.mysql.jdbc.Driver      mysql数据库连接jar包.   获取途径: 链接:https://pan.baidu.com/s/1SFcjuu ...

  4. 反转链表-PHP的实现

    <? //节点 class Node { private $Data;//节点数据 private $Next;//下一节点 public function setData($value) { ...

  5. thinkphp5.1生成缩略图很模糊

    缩略图一定要从大分辨率往小生成 $image->thumb(400,400,\think\Image::THUMB_CENTER)->save(Env::get('root_path'). ...

  6. [Windows API] Listing the Files in a Directory,可用来数文件夹下有多少个子文件(夹)

    转载 #include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe ...

  7. Mina Basics 02-基础

    基础 在第1章中,我们简要介绍了Apache MINA.在本章中,我们将了解客户端/服务器体系结构以及有关基于MINA的服务器和客户端的详细信息. 我们还将基于TCP和UDP公开一些非常简单的服务器和 ...

  8. 个人博客开发系列:Vue.js + Koa.js项目中使用JWT认证

    前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). 更多的介绍和说明,以及各种原理,我在此就不多赘诉了.JWT不是一个新鲜 ...

  9. Win10美吱er吱er,Win10修改默认字体的方法

    请参考以下步骤(需要修改注册表,修改前请先备份,以便在出现问题时能够及时恢复): 例:将系统字体改为宋体 1.Windows+r,输入:regedit 2.定位以下路径:HKEY_LOCAL_MACH ...

  10. 2019/2/20训练日记+map/multi map浅谈

    Most crossword puzzle fans are used to anagrams - groups of words with the same letters in different ...