大炮打蚊子

本文介绍了一种利用炮弹攻击二维平面上的蚊子问题,通过计算杀伤范围和蚊子分布,演示了如何确定每发炮弹消灭的蚊子数量。涉及输入矩阵、炮弹轨迹分析及结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:

 O
OXO
 O

 

其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。

输入格式:

第一行为两个不超过20的正整数MN,中间空一格,表示二维平面有M行、N列。

接下来M行,每行有N0或者#字符,其中#表示所在格子有蚊子。

接下来一行,包含一个不超过400的正整数k,表示发射炮弹的数量。

最后k行,每行包括一发炮弹的整数坐标xy(0≤x<M,0≤y<N),之间用一个空格间隔。

输出格式:

对应输入的k发炮弹,输出共有k行,第i行即第i发炮弹消灭的蚊子数。

输入样例:

5 6
00#00#
000###
00#000
000000
00#000
2
1 2
1 4

输出样例:

0
2

#define _CRT_SECURE_NO_WARNINGS
#define MAX_ARR 20
#include<stdio.h>
#include<string.h>
int main() {
	int M, N, i, j, k, x, count = 0;
	char arr[MAX_ARR][MAX_ARR];
	int str[MAX_ARR][MAX_ARR];
	scanf("%d %d", &M, &N);
	getchar();
	for (i = 0; i < M; i++)
	{
		for (j = 0; j < N; j++)
		{
			scanf("%c", &arr[i][j]);
			if (arr[i][j] == '#')
				str[i][j] = 2;
			else
				str[i][j] = 0;
		}
		getchar();
	}
	scanf("%d", &x);
//上下左右的情况分别讨论
	for (k = 0; k < x; k++)
	{
		scanf("%d %d", &i, &j);
		if (arr[i][j] == '#')
		{
			arr[i][j] = '0';
			str[i][j] = 0;
			count++;
		}
		i--;
		if (i > -1)
			if (arr[i][j] == '#')
				if (!--str[i][j])
				{
					arr[i][j] = '0';
					count++;
				}
		i = i + 2;
		if (i < M)
			if (arr[i][j] == '#')
				if (!--str[i][j])
				{
					arr[i][j] = '0';
					count++;
				}
		i--; j--;
		if (j > -1)
			if (arr[i][j] == '#')
				if (!--str[i][j])
				{
					arr[i][j] = '0';
					count++;
				}
		j = j + 2;
		if (j < N)
			if (arr[i][j] == '#')
				if (!--str[i][j])
				{
					arr[i][j] = '0';
					count++;
				}
		printf("%d\n", count);
		count = 0;
	}
	return 0;
}

### 关于PTA平台上的“大炮蚊子”问题 在处理这个问题时,主要目标是在给定的M×N网上模拟炮弹爆炸的效果,并统计被消灭的蚊子数量。为了实现这一功能,在C++中可以采用数组来表示二维平面并追踪每个位置的状态。 #### 初始化环境与输入读取 程序开始时需定义两个常量`m`和`n`分别代表行数和列数。接着通过标准输入获取这些值以及整个地图的信息——即哪些地方有蚊子存在。对于每一个可能的目标坐标(x, y),还需接收其具体数值以便后续计算影响区域内的总分。 ```cpp #include <iostream> using namespace std; int main() { int m, n; cin >> m >> n; // 获取矩阵大小 char grid[m][n]; for (int i = 0; i < m; ++i){ for(int j=0;j<n;++j){ cin>>grid[i][j]; // 输入初始状态图 } } int target_x, target_y; cin >> target_x >> target_y; // 目标点的位置 } ``` #### 计算杀伤范围及其效果 根据题目描述中的模式 `O OXO O`, 可知中心点(X)处命中会摧毁自身加上周围八个方向各一格内的所有单位。因此当指定某一点作为攻击对象之后,应该遍历这九个相对偏移量(-1,-1), (-1,0)...(1,1),并对落在合法边界内且标记为含有蚊子('M')的地方累加计数器。 ```cpp // 统计受影响区域内存在的蚊子数目 void countAffectedMosquitoes(const char (&grid)[m][n], const pair<int,int>& center, int& affectedCount) { static constexpr array<pair<short, short>,9> offsets{ {{-1,-1},{-1,0},{-1,+1}, { 0,-1}, { 0,+1}, {+1,-1},{+1,0},{+1,+1}} }; auto [cx,cy]=center; for(auto&& offset :offsets){ int nx=cx+offset.first ,ny=cy+offset.second ; if(nx>=0 && ny>=0 &&nx<m && ny<n){ // 边界检查 if(grid[nx][ny]=='M'){ ++affectedCount; } } } } ... countAffectedMosquitoes(grid,{target_x,target_y},affectedCount); cout << "Total Mosquitos Hit:"<< affectedCount<<"\n"; ``` 上述代码片段展示了如何针对特定坐标的打击操作进行建模[^1]。需要注意的是这里假设了输入数据式正确无误;实际应用中应当加入更多健壮性的考量比如错误处理机制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值