[CF1105D]Kilani and the Game

[CF1105D]Kilani and the Game

题目大意:给出一个$n\times m(n,m\leqslant10^3)$的地图,有$k(k\leqslant9)$个玩家,第$i$个玩家速度为$s_i$。地图中$\#$代表障碍;$.$ 代表空地;数字代表是一名编号为此数字的玩家的城堡。每个玩家按编号轮流操作,每次操作把自己城堡周围$s_i$格内的空地变成自己城堡。直到没有玩家能操作为止。输出每名玩家城堡的个数。

题解:$bfs$,显然发现每个点只会扩展一次,用$k$个$queue$保存每个人的可扩展的城堡,模拟扩展即可,$s_i$可以每次扩展一格,扩展$s_i$次来解决。复杂度$O(nm)$

卡点:

 

C++ Code:

#include <algorithm>
#include <cctype>
#include <cstdio>
#include <queue>
#define maxn 1005
#define maxk 10
const int D[2][4] = {
    {1, 0, -1, 0}, {0, 1, 0, -1}};

struct Point {
	int x, y;
	Point() { }
	Point(int __x, int __y) : x(__x), y(__y) { }
} ;
std::queue<Point> q[maxk];

bool used[maxn][maxn], Continue[maxk];
int n, m, k, len[maxk], ans[maxk];

inline bool over_range(int x, int y) {
	return x < 1 || x > n || y < 1 || y > m || used[x][y];
}

int main() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 0; i < k; ++i) scanf("%d", len + i);
	for (int i = 1; i <= n; ++i) {
		static char s[maxn];
		scanf("%s", s + 1);
		for (int j = 1; j <= m; ++j) if (s[j] != '.') {
			used[i][j] = true;
			if (isdigit(s[j])) {
				int pos = (s[j] & 15) - 1;
				++ans[pos];
				q[pos].push(Point(i, j));
			}
		}
	}
	for (int now = 0, num = k; num; now += 1 - k, now += now >> 31 & k) {
		static std::queue<Point> Q;
		std::queue<Point> &q = ::q[now];
		for (int Tim = len[now]; Tim; --Tim) {
			if (q.empty()) {
				num -= !Continue[now];
				Continue[now] = true;
				break;
			}
			while (!q.empty()) {
				Point u = q.front(); q.pop();
				for (int i = 0, x, y; i < 4; ++i) {
					x = u.x + D[0][i], y = u.y + D[1][i];
					if (!over_range(x, y)) {
						++ans[now];
						used[x][y] = true;
						Q.push(Point(x, y));
					}
				}
			}
			std::swap(q, Q);
		}
	}
	for (int i = 0; i < k; ++i) printf("%d ", ans[i]); puts("");
	return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10350986.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101137.html原文链接:https://javaforall.net

(0)
上一篇 2021年6月29日 下午7:00
下一篇 2021年6月29日 下午8:00


相关推荐

  • c++char和int转换_int转换为char数组

    c++char和int转换_int转换为char数组int转char类型

    2022年10月21日
    5
  • telnet 命令使用方法详解,telnet命令怎么用?[通俗易懂]

    telnet 命令使用方法详解,telnet命令怎么用?[通俗易懂]什么是Telnet?对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了Telnet

    2022年8月2日
    31
  • Django Pycharm 修改html后立即刷新页面

    Django Pycharm 修改html后立即刷新页面DjangoPychar 修改 html 后立即刷新页面写项目时需要页面实时刷新 而不是频繁人肉重启项目 测试过 dj static django livereload server 此处使用 livereload 包 简单好用 仅在 debug False 时生效 不过可以满足调试需求了 安装 pipinstallli 如果报错 Usinglegacy setup pyinstall forlivereloa sincepackage wheel isnotin

    2026年3月17日
    0
  • Python实现AI图像识别-身份证识别

    Python实现AI图像识别-身份证识别图像识别说白了就是把一张照片上面的文字进行提取,提供工作效率需求分析身份证识别主要是把一张身份证照片上面的文字信息进行提取,不用再使用人工去手动抄写了,下面给大家说的这个身份识别主要是使用python+flask+华为云OCR进行实现的。步骤申请华为云OCR接口获取token调用身份证识别接口提取身份证信息申请华为云OCR接口图像识别主要使用的就是华为云OCR平台申请的接口,申请地址为:“https://www.huaweicloud.com”。访问申请的地址后点击菜单栏中的“控制台”

    2022年7月16日
    34
  • Python字符串转义符大全

    Python字符串转义符大全0 NUL 空字符 ascii 值 0 1 SOH 标题开始 ascii 值 1 2 STX 正文开始 ascii 值 2 3 ETX 正文结束 ascii 值 3 4 EOT 传输结束 ascii 值 4 5 ENQ 请求 ascii 值 5 6 ACK 收到通知 ascii 值 6 7 BEL 响铃 ascii 值 7 a BEL 响铃 ascii 值 7 b BS 退格 ascii 值 8 t HT 水平制表符 ascii 值 9 n NL 换行键 ascii 值 10 v VT 垂直制表符 ascii 值 11 f FF 换页键 ascii 值 12

    2026年3月17日
    1
  • 机器学习 —— 浅谈贝叶斯和MCMC

    机器学习 —— 浅谈贝叶斯和MCMC‍‍Abstract:最近课业内的任务不是很多,又临近暑假了,就在网上搜了一些有关于机器学习和深度学习的课程进行学习。网上的资料非常繁多,很难甄别,我也是货比三家进行学习…

    2022年5月5日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号