二维数组实战,大炮打蚊子

大炮打蚊子
上课记录

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

  O
 O X O
  O

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

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

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

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

最后k行,每行包括一发炮弹的整数坐标x和y(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

思路:把蚊子的血量设置为2,大炮伤害中心点为2,边缘点为1。读入二维数组里,0表示没有蚊子,读入血量0,#表示有蚊子,读入血量2。注意m和n输入完会有一个换行符,需要拿走,每行读完也有换行符需要拿走。判断是否打死蚊子时,要注意越界问题。大炮边缘点很可能是越界的,而且当前位置血量为0或者为负数的时候表示已经没有蚊子可以打了,不能进行扣血操作,应当返回没有打死蚊子。

#include<stdio.h>

int m, n;
int board[20][20];

int bang(int x, int y,int kill) {//打在(x,y)能不能消灭
	if (x>=0 && x<m && y>=0 && y<n && board[x][y]>0)//越界判断,且判断如果没有存活的蚊子时不能掉血
	{
		board[x][y] -= kill;
		if (board[x][y] <= 0)
			return 1;
		else
			return 0;
	}
	else
	{
		return 0;
	}
}

int main() {
	
	scanf("%d%d", &m, &n);
	getchar();//m和n输入完有换行符,必须拿走,不然会影响
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			board[i][j] = getchar() == '0' ? 0 : 2;//是0就读入0,不是0读入2
		}
		getchar();//每行结束也有换行符,得拿走
	}

	int k, x, y;
	scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		scanf("%d%d", &x, &y);
		int count = 0;//计数消灭多少只
		count += bang(x, y, 2);//
		count += bang(x - 1, y, 1);
		count += bang(x + 1, y, 1);
		count += bang(x, y - 1, 1);
		count += bang(x, y + 1, 1);
		printf("%d\n", count);
	}
	return 0;
}
posted @ 2020-03-24 23:20  akatsukiya7  阅读(57)  评论(0)    收藏  举报