大炮打蚊子(C++)
阿新 • • 發佈:2018-12-04
大炮打蚊子
現在,我們用大炮來打蚊子:蚊子分佈在一個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
這題我用的是C++,騷話少說 上程式碼:
#include <bits/stdc++.h> using namespace std; //講個笑話 老師叫我們寫的這題叫做高射炮打蚊子 int main() { ios::sync_with_stdio(false); //取消cin和stdin的同步 int M, N; //M行N列 cin >> M >> N; int a[M][N]; //用字元型二維陣列來模擬一個二維平面 for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { char temp; cin >> temp; if(temp=='0') { a[i][j] = 0; } else //直接把#號變成2,因為蚊子有復活甲,它有2條命 { a[i][j] = 2; //表示蚊子滿血 } } } int k; //發射炮彈的數量k cin >> k; int x, y; //發射炮彈的整數座標 for(int i=0;i<k;i++) { cin >> x >> y; int num =0; //用來記錄炮彈消滅的蚊子數 if(a[x][y]>0) { a[x][y] = 0; //正中目標,一擊斃命 num++; } if(x-1>=0) //左方 { if(a[x-1][y]!=0) { a[x-1][y]--; //表示蚊子少了半條命 if(a[x-1][y]==0) { num++; } } } if(x+1!=M) //右方 { if(a[x+1][y]!=0) { a[x+1][y]--; if(a[x+1][y]==0) { num++; } } } if(y-1>=0) //上方 { if(a[x][y-1]!=0) { a[x][y-1]--; if(a[x][y-1]==0) { num++; } } } if(y+1!=N) //下方 { if(a[x][y+1]!=0) { a[x][y+1]--; if(a[x][y+1]==0) { num++; } } } cout << num<< endl; } /* 嚶嚶嚶 我偷偷查看了一下輸出後的二維矩陣 for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { cout << a[i][j] << " "; } cout << endl; } */ return 0; }