1. 程式人生 > >大炮打蚊子(C++)

大炮打蚊子(C++)

大炮打蚊子 

現在,我們用大炮來打蚊子:蚊子分佈在一個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

這題我用的是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;
}