現在,我們用大炮來打蚊子:蚊子分布在一個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
思路: 打到的點標記為0 ,旁邊的點減一,統計一下死掉的蚊子數量就行了
#include<bits/stdc++.h> using namespace std; int main() { int nums[200][200]; memset(nums,0,sizeof(nums)); int M , N ; cin>>M>>N; getchar(); char c ; for(int i = 0; i < M ; i++){ for(int j = 0 ; j < N ; j++){ cin>>c; if(c == '0') nums[i][j] = 0; else nums[i][j] = 2;// 滿血的蚊子 } } int k; cin>>k; int x , y ; while(k--){ cin>>x>>y; int sum = 0 ; // 打死的蚊子的數量 if(nums[x][y]!=0){ sum++; nums[x][y] = 0 ; } // 下面四個if 是四個方位的蚊子 if((x-1>=0) && nums[x-1][y] != 0 ){ if(nums[x-1][y] == 1 ){ sum++; nums[x-1][y] = 0 ; } else if(nums[x-1][y] == 2){ nums[x-1][y]--; } } if((x+1 < M) && nums[x+1][y] != 0){ if(nums[x+1][y] == 1 ){ sum++; nums[x+1][y] = 0 ; } else if(nums[x+1][y] == 2){ nums[x+1][y]--; } } if((y+1 < N) && nums[x][y+1] != 0){ if(nums[x][y+1] == 1 ){ sum++; nums[x][y+1] = 0 ; } else if(nums[x][y+1] == 2){ nums[x][y+1]--; } } if((y-1 >= 0) && nums[x][y-1] != 0){ if(nums[x][y-1] == 1 ){ sum++; nums[x][y-1] = 0 ; } else if(nums[x][y-1] == 2){ nums[x][y-1]--; } } cout<<sum<<endl; } return 0; }