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;
}
不忘初心方得始终