大炮打蚊子(c语言易懂版)

7-80 大炮打蚊子 (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<stdio.h>

int main()

{    char wen[25][25];

   int m,n;  

 scanf("%d %d ",&m,&n);    

int i,j;  

 for(i=0;i<=n+1;i++)     wen[0][i]='0';    

for(i=1;i<=m;i++)    wen[i][0]='0';  

 for(i=0;i<=n+1;i++)       wen[m+1][i]='0';    

for(i=1;i<=m;i++)        wen[i][n+1]='0';    for(i=1;i<=m;i++)  

 {for(j=1;j<=n;j++)    

   {wen[i][j]=getchar();          

 if(wen[i][j]=='#')                

wen[i][j]='2';        }    

if(i!=m)    scanf(" ");    }    

int k,x,y;    scanf("%d",&k);  

 for(i=0;i<k;i++)  

 {        int num=0;        scanf("%d%d",&x,&y);        x=x+1;y=y+1;        

if(wen[x][y]=='1'||wen[x][y]=='2')        

{num++;wen[x][y]='0';}      

  if(wen[x-1][y]=='1')      

  {num++;wen[x-1][y]=='0';}      

 else wen[x-1][y]--;      

 if(wen[x][y-1]=='1')      

  {num++;wen[x][y-1]='0';}        

else wen[x][y-1]--;      

 if(wen[x+1][y]=='1')        

{num++;wen[x+1][y]='0';}    

   else wen[x+1][y]--;      

 if(wen[x][y+1]=='1')      

  {num++;wen[x][y+1]='0';}      

 else wen[x][y+1]--;      

 printf("%d ",num);    }    

return 0;}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值