炮打蚊子(問題程式碼)
阿新 • • 發佈:2019-01-28
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> #include<cstring> using namespace std; int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; int vis[25][25]; int vv[25][25]={0}; int main(){ int m,n; char map[25][25]; cin>>m>>n; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>map[i][j]; } } int k; cin>>k; memset(vis,0,sizeof(vis)); for(int i=0;i<k;i++){ int cnt=0; int p,q; cin>>p>>q; if(map[p][q]=='#'){ vv[p][q]+=2; } for(int i=0;i<4;i++){ int xx,yy; xx=p+dir[i][0]; yy=q+dir[i][1]; if(xx>=0&&xx<m&&yy>=0&&yy<m){ vv[xx][yy]=vv[xx][yy]+1; } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(vv[i][j]==2&&map[i][j]=='#'&&!vis[i][j]){ vis[i][j]=1; //cout<<i<<' '<<j<<endl; cnt++; } } } cout<<cnt<<endl; } }
總是顯示部分答案通過,實在看不出問題。。。。Σ(っ °Д °;)っ