列表

详情


NC231931. 顽皮恶魔

描述

浮云阴,骤雨倾,顽皮恶魔镰刀显。

你的庄园是一块 的草坪。

现在有一些格子是普通植物 ,有一些格子是萝卜保护伞 ,有一些格子是僵尸 。(已经在格子上的僵尸不会吃掉植物或移动)

tip:萝卜保护伞可以保护周围 的植物,即一个位于位置 (x,y) 的萝卜保护伞可以保护位于  以及自身九个格子上的植物。

现在你想知道,对于这样一块给定的草坪,假设有无穷多个飞贼,能够偷走最多数量的植物是多少。

输入描述

全文第一行输入一个正整数 ,表示数据组数。

每组数据第一行输入两个正整数 ,表示草坪的长和宽。

接下来输入一个 的字符矩阵表示草坪的大小,字符矩阵中仅包含  三种字符。

数据保证

输出描述

每行输出一个整数表示最多被偷走的植物数量。

示例1

输入:

1
5 5
ZPZPZ
P*PZP
ZPZPZ
PZPZP
ZP*PZ

输出:

5

说明:

分别位于 (2,2)(5,3) 上的保护伞可以保护周围的植物,最后能被偷走的植物如下图所示:(\# 表示即将被偷走,\tt * 表示保护伞,\tt P 表示被保护)



肉眼可见最后有分别位于 (1,4),(2,5),(3,4),(4,1),(4,5) 的五株被偷走。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 258ms, 内存消耗: 1556K, 提交时间: 2022-01-22 15:15:13

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[1005][1005];
int main(){
	int n,m,t;
	cin>>t;
	while(t--){
	cin>>n>>m;int s=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		cin>>a[i][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='*')
			for(int k=i-1;k<=i+1;k++)
			for(int l=j-1;l<=j+1;l++)
			if(a[k][l]=='P')a[k][l]='Z';
		}
	}
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i][j]=='P')s++;
			cout<<s<<endl;
	}
	return 0;
}

上一题