7-7 大炮打蚊子 (15 分)
现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:
O
OXO
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
把二维字符串转化为二维数组,注意初始化为负数。具体见代码。
#include<iostream>
using namespace std;
int a[700][700];
int main()
{
int h,l;
cin>>h>>l;
int i,j,k,x,y;
fill(a[0],a[0]+700*700,-1000);
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
char c;
cin>>c;
if(c=='#')
{
a[i][j]=1;
}
else
{
a[i][j]=0;
}
}
}
cin>>k;
while (k--)
{
int sum=0;
cin>>x>>y;
if(a[x][y]>=1)
{
sum++;
a[x][y]=0;
}
if(a[x+1][y]>=1)
{
if(a[x+1][y]>1)
{
sum++;
a[x+1][y]=0;
}
else
a[x+1][y]++;
}
if((x-1)>=0)
if(a[x-1][y]>=1)
{
if(a[x-1][y]>1)
{
sum++;
a[x-1][y]=0;
}
else
a[x-1][y]++;
}
if(a[x][y+1]>=1)
{
if(a[x][y+1]>1)
{
sum++;
a[x][y+1]=0;
}
else
a[x][y+1]++;
}
if((y-1)>=0)
if(a[x][y-1]>=1)
{
if(a[x][y-1]>1)
{
sum++;
a[x][y-1]=0;
}
else
a[x][y-1]++;
}
cout<<sum<<endl;
}
return 0;
}