1. 程式人生 > >炮打蚊子(問題程式碼)

炮打蚊子(問題程式碼)

7-7 大炮打蚊子(15 分)

現在,我們用大炮來打蚊子:蚊子分佈在一個M×N格的二維平面上,每隻蚊子佔據一格。向該平面的任意位置發射炮彈,炮彈的殺傷範圍如下示意:

 O
OXO
 O

其中,X為炮彈落點中心,O為緊靠中心的四個有殺傷力的格子範圍。若蚊子被炮彈命中(位於X格),一擊斃命,若僅被殺傷(位於O格),則損失一半的生命力。也就是說,一次命中或者兩次殺傷均可消滅蚊子。現在給出蚊子的分佈情況以及連續k發炮彈的落點,給出每炮消滅的蚊子數。

輸入格式:

第一行為兩個不超過20的正整數MN,中間空一格,表示二維平面有M行、N列。

接下來M行,每行有N0或者#字元,其中#表示所在格子有蚊子。

接下來一行,包含一個不超過400的正整數k,表示發射炮彈的數量。

最後k行,每行包括一發炮彈的整數座標xy(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;
    }
}

總是顯示部分答案通過,實在看不出問題。。。。Σ(っ °Д °;)っ