现在,我们用大炮来打蚊子:蚊子分布在一个M×NM imes NM×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:
O
OXO
O
其中,X
为炮弹落点中心,O
为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X
格),一击毙命,若仅被杀伤(位于O
格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k
发炮弹的落点,给出每炮消灭的蚊子数。
输入格式:
第一行为两个不超过20的正整数M
和N
,中间空一格,表示二维平面有M
行、N
列。
接下来M
行,每行有N
个0
或者#
字符,其中#
表示所在格子有蚊子。
接下来一行,包含一个不超过400的正整数k
,表示发射炮弹的数量。
最后k
行,每行包括一发炮弹的整数坐标x
和y
(0≤le≤x
<<<M
,0≤le≤y
<<<N
),之间用一个空格间隔。
输出格式:
对应输入的k
发炮弹,输出共有k
行,第i
行即第i
发炮弹消灭的蚊子数。
输入样例:
5 6
00#00#
000###
00#000
000000
00#000
2
1 2
1 4
输出样例:
0
2
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 int main() 9 { 10 char a[25][25]; 11 double life[25][25]; 12 double newlife[25][25]; 13 memset(life,0.0,sizeof(life)); 14 memset(newlife,0.0,sizeof(newlife)); 15 int m,n; 16 scanf("%d%d",&m,&n); 17 int i,j; 18 for(i=1;i<=m;i++) 19 for(j=1;j<=n;j++) 20 { 21 cin>>a[i][j]; 22 if(a[i][j]=='#') 23 { 24 life[i][j]=1.0; 25 newlife[i][j]=1.0; 26 } 27 } 28 int t,T,q,p,sum; 29 scanf("%d",&T); 30 for(t=1;t<=T;t++) 31 { 32 scanf("%d%d",&q,&p); 33 sum=0; 34 q++;p++;//注意题目给的是从0到n-1,m-1; 35 newlife[q][p]-=1.0; 36 newlife[q-1][p]-=0.5; 37 newlife[q][p-1]-=0.5; 38 newlife[q+1][p]-=0.5; 39 newlife[q][p+1]-=0.5; 40 for(i=1;i<=m;i++) 41 for(j=1;j<=n;j++) 42 { 43 if(life[i][j]==1.0&&newlife[i][j]<=0.0) 44 { 45 sum++; 46 life[i][j]=0.0; 47 } 48 } 49 printf("%d ",sum); 50 } 51 return 0; 52 }