Bomb Game 题解

题目

题目链接

Bomb Game

题目大意

有一个a行b列的矩形院子,在某个格子里有一个碉堡。你有k个炸弹,每个炸弹被安放时候可以指定安放在第r行s列。炸弹爆炸会对以(r,s)为中心的边长为p的正方形造成影响(p为奇数)。每次爆炸都会告诉你是否对碉堡造成影响。现在求碉堡可能的位置数量。

输入

第一行为a, b, k。其中1<= a,b,k <=100。

接下来k行依次表示每个炸弹的r, s, p, t。其中t=1表示影响到了碉堡,t=0表示未影响到碉堡。

输出

输出碉堡可能的位置的数量。

输入样例

5 5 3
3 3 3 1
3 4 1 0
3 4 3 1

输出样例

5

题解

手动推一次样例后发现,炸弹爆炸如果对碉堡造成影响,那么碉堡肯定不在未被影响到的格子里。

如果炸弹爆炸未对碉堡造成影响,那么碉堡肯定不在被影响到的格子里。

如此几次炸弹下来,利用排除法,剩下的格子的数量就是答案。

Then show the code.

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int a, b, r, s, k, p, t, cnt;
char field[105][105], field_1[105][105];

int main(){
    scanf("%d%d%d", &a, &b, &k);
    memset(field, 1, sizeof(field));
    while(k--){
        scanf("%d%d%d%d", &r, &s, &p, &t);
        int x0, y0, x1, y1;
        x0 = max(1, r-(p/2)); y0 = max(1, s-(p/2));
        x1 = min(a, r+(p/2)); y1 = min(b, s+(p/2));
        if(t){
            memset(field_1, 0, sizeof(field_1));
            //先标记出哪些格子被影响
            for(int i=x0; i<=x1; i++)
                for(int j=y0; j<=y1; j++)
                    field_1[i][j] = 1;
            //未被影响的格子肯定碉堡不在这
            for(int i=1; i<=a; i++)
                for(int j=1; j<=b; j++)
                    if(!field_1[i][j])
                        field[i][j] = 0;
        } else{
            //碉堡肯定不在被影响的格子里
            for(int i=x0; i<=x1; i++)
                for(int j=y0; j<=y1; j++)
                    field[i][j] = 0;
        }
    }
    for(int i=1; i<=a; i++)
        for(int j=1; j<=b; j++)
            if(field[i][j]) cnt++;
    printf("%d\n", cnt);

    return 0;
}
posted @ 2020-12-14 23:20  1v7w  阅读(260)  评论(0编辑  收藏  举报