D. Kilani and the Game(BFS模拟向四周漫延的过程)

news2024/7/6 20:07:39

Problem - D - Codeforces

Kilani正在和他的朋友玩一个游戏。这个游戏可以表示为一个n×m的网格,其中每个单元格都是空的或者被阻塞的,并且每个玩家在一些单元格中拥有一个或多个城堡(一个单元格中没有两个城堡)。

游戏分轮进行。每轮玩家依次扩展:首先,第一个玩家扩展,然后第二个玩家扩展,依此类推。扩展发生如下:对于每个现在拥有的城堡,玩家尝试扩展到附近的空单元格。如果从拥有他的城堡到空单元格的距离不超过si(si是玩家的扩展速度),则玩家i可以向左、上、右或下扩展,而不经过被阻塞的单元格或被其他玩家的城堡占据的单元格。玩家检查他可以扩展到的单元格集,并一次性在每个单元格中构建一个城堡。然后将回合传递给下一个玩家。

当没有玩家能够行动时,游戏结束。你将得到游戏场地和每个玩家扩展速度。Kilani想知道每个玩家在游戏结束后将控制多少个单元格(拥有一个城堡)。

输入 第一行包含三个整数n,m和p(1≤n,m≤1000,1≤p≤9)——网格的大小和玩家数量。

第二行包含p个整数si(1≤s≤109)——每个玩家扩展的速度。

接下来的n行描述了游戏网格。它们中的每一个都由m个符号组成,其中“。”表示空单元格,“#”表示阻塞单元格,数字x(1≤x≤p)表示玩家x拥有的城堡。

保证每个玩家在网格上至少有一个城堡。

输出 打印p个整数——游戏结束后每个玩家控制的单元格数。

Examples

input

Copy

3 3 2
1 1
1..
...
..2

output

Copy

6 3 

input

Copy

3 4 4
1 1 1 1
....
#...
1234

output

Copy

1 4 3 3 

题解:
题意很容易理解,假设当前玩家i的城堡有cnt个,每个城堡内的曼哈顿距离为si的都要覆盖上,

那么如何模拟这个过程呢?

每次所有已有城堡都往四周扩散一次,把旧的城堡清空,新的城堡存进来,直到没有新的城堡存入,或者扩散了si次,对于每个玩家i都是这样扩展si次,直到所有点被填充,由于每个点顶多访问1次,所以也不会超时

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
int n,m,k;
int cnt[10];
int mp[1004][1004];
vector<PII> p[10];
int ans[10];
int dx[4] ={0,0,-1,1};
int dy[4] ={-1,1,0,0};
int f = 0;
void bfs(int x)
{
	vector<PII> now;
	while(p[x].size())
	{
		PII t = p[x].back();
		now.push_back(t);
		p[x].pop_back();
	}
	for(int j = 0;j < now.size();j++)
	{
		PII t = now[j];
		for(int i = 0;i < 4;i++)
		{
			int tx = t.first + dx[i];
			int ty = t.second + dy[i];
			if(tx >= 1&&tx <= n&&ty >= 1&&ty <= m&&!mp[tx][ty])
			{
				mp[tx][ty] = x;
				ans[x]++;
				p[x].push_back({tx,ty});
			}
		}
	}
	if(p[x].size())
	{
		f = 1;
	}
	else
	{
		f = 0;
	}
}
void solve()
{
	cin >> n >> m >> k;
	for(int i = 1;i <= k;i++)
	cin >> cnt[i];
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			char x;
			cin >> x;
			if(x == '.')
			{
				mp[i][j] = 0;
				continue;
			}
			else if(x == '#')
			{
				mp[i][j] = 1000;
				continue;
			}
			int y = x - '0';
			mp[i][j] = y;
			if(y >= 1&&y <= 9)
			{
				p[y].push_back({i,j});
				ans[y]++;
			}
		}
	}
	while(1)
	{
		int flag = 0;
		for(int i = 1;i <= k;i++)
		{
			f = 0;
			for(int j = 1;j <= cnt[i];j++)
			{
				bfs(i);
				flag = flag|f;
				if(!f)
				break;
			}
		}
		if(!flag)
		break;
	}
	for(int i = 1;i <= k;i++)
	cout << ans[i] <<" ";
}
//5 7 8 9 10

signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS高级 -- 构造函数、数据常用函数

1. 深入对象 1.1 创建对象三种方式 利用对象字面量创建对象 const o {name:佩奇 }利用 new object 创建对象 const o new Object({ name:佩奇}) console.log(o) // {name: 佩奇}利用构造函数创建对象 1.2 构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要…

SpringBoot+Vue3实现登录验证码功能

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09;_java邮件通知_心态还需努力呀的博客-CSDN博客 该系列文章持续更新…

最高效的七个云原生开发原则

​Cloud native是一种软件开发方法&#xff0c;利用云基础架构实现更快、更可扩展的部署。云原生应用程序旨在充分利用现代化的工程实践&#xff0c;如自动化、托管服务和自动扩展控制。 这种模式对组织文化和工作实践也有影响。云技术应成为软件交付的重要组成部分。每个人都…

迅为三星4412开发板UDP实现服务器和客户端

UDP 协议是开放式&#xff0c;无连接&#xff0c;不可靠的传输层通信协议&#xff0c;但它收发数据的速度相对于 TCP 快很多&#xff0c;常 用在传输音视频等数据量非常大的场合。 udp 网络编程只需要使用一个类 QUdpSocket。 本实验中对 QUdpSocket 的基本使用&#xff1a; …

选择DAO的组织结构时,应着重考虑的各个关键阶段与安全可靠性

近年来&#xff0c;去中心化自治组织 (Decentralized Autonomous Organizations&#xff0c;DAO)已成为了管理智能合约项目和社区的流行方式。简单而言&#xff0c;DAO是一个基于智能合约运作的数字化组织。组织内的成员可以根据对应的模型结构&#xff0c;做出不同的决策。虽然…

哪款蓝牙耳机学生用合适?学生党平价无线耳机推荐

近年来&#xff0c;蓝牙耳机凭借使用便捷&#xff0c;成为了许多人生活中不可或缺的一部分。不管是听歌、追剧还是玩游戏&#xff0c;或者运动等等&#xff0c;都能看到戴蓝牙耳机的人。那么&#xff0c;哪款蓝牙耳机适合学生用&#xff1f;下面&#xff0c;我来给大家推荐几款…

Unsupervised Learning of Depth and Ego-Motion from Video 论文精读

视频中深度和自我运动的无监督学习 摘要 我们提出了一个无监督学习框架&#xff0c;用于从非结构化视频序列中进行单眼深度和相机运动估计。与其他工作[10&#xff0c;14&#xff0c;16]一样&#xff0c;我们使用端到端的学习方法&#xff0c;将视图合成作为监督信号。与之前…

C++ 线程

linux使用线程 在linux使用线程可能出现&#xff0c;在编译时不会报错&#xff0c;但执行出错的问题。 undefined reference to pthread_create这是由于ubuntu平台下调用pthread_create()函数&#xff0c;pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 …

Word转PDF:简单步骤,轻松完成!推荐两个实现的方法

随着社会的发展&#xff0c;PDF 文件已经成为一种非常流行的文件格式&#xff0c;对于一些需要对文件进行保密的企业而言&#xff0c;更是必不可少。在这样的大背景下&#xff0c;如何将 Word 文件转换为 PDF 文件呢&#xff1f;下面是一些简单的步骤&#xff0c;帮助您轻松完成…

Rust-Shyper:基于 Rust 语言的高可靠、开源嵌入式 Hypervisor

「Rust-Shyper 是北京航空航天大学计算机学院王雷教授团队设计开发的虚拟机监控器&#xff0c;该系统基于 Rust 语言&#xff0c;实现了一个高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日 Rust-Shyper 正式在 openEuler 社区开源。」 项目地址&#xff1a;https://gitee.com…

论文阅读笔记:Hearing Lips Improving Lip Reading by Distilling Speech Recognizers

目录 论文链接 研究背景 LIBS 的整体框架 序列级知识蒸馏 上下文级知识蒸馏 最长公共子序列 (LCS) 帧级别知识蒸馏 论文链接 [1911.11502] Hearing Lips: Improving Lip Reading by Distilling Speech Recognizers (arxiv.org) 研究背景 这篇文章针对由于唇语识别动作…

【观察】解码“一网统管”:城市治理“新范式”,推动数字城市建设迈向“新高度”...

众所周知&#xff0c;随着城市化进程加快&#xff0c;大量的人员、物资、技术和信息等要素日益向城市汇聚&#xff0c;城市系统变得越来越复杂&#xff0c;随之而来的社会问题和“城市病”也层出不穷&#xff0c;而传统的治理模式和治理手段越来越难以胜任日益复杂城市的管理需…

深聊丨第四范式陈雨强:如何用AI大模型打开万亿规模传统软件市场?

文丨亲爱的数据 谭婧 “GPT大模型到底能不能用&#xff1f;用在哪里&#xff1f;” 这是目前中国大型企业一把手最关心的问题之一。AI大模型也被媒体称为“一把手”工程。 大型企业会非常认真地考虑大模型的应用。最近个把月&#xff0c;大型企业客户对大模型的热烈反应让第四范…

进程状态以及两种特殊进程

目录 进程状态1 具体状态2 进程状态的意义3 进程状态实例3.1 R&S&T认识3.2 认识Z & 僵尸进程 & 孤儿进程僵尸进程孤儿进程 进程状态 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内…

==、equals区别 | java学习笔记

做一些java基础知识的记录&#x1f4d5; java基本类型&#xff1a;byte short int long float double char boolean&#xff08;指向具体的数值&#xff09; java引用类型&#xff1a;类 接口 数组等。指向的不是具体的数值&#xff0c;而是指向了对象的地址。 用于判断基本类…

JavaWeb|在IDEA中创建基于Maven的Web项目| Servlet依赖|这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

【c语言】详解c语言#预处理期过程 | 宏定义前言

c语言系列专栏&#xff1a; c语言之路重点知识整合 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持…

微信小程序php+python+nodejs+vue大学生心理健康测试职位推荐系统

心理测试开发使系统能够更加方便学生捷&#xff0c;同时也促使心理测试变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。具体在系统设计上&#xff0c;客户端使用微信开发者&#xff0c;后台也使用php技术在动态页面上进行了设计&#xff0c;Mysql数据库&#xf…

算法 DAY44 动态规划6 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

Java每日一练(20230427)

目录 1. 螺旋矩阵 2. LRU 缓存机制 3. 解数独 &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#…