OpenJudge NOI 2.1 1661:Bomb Game

【题目链接】

OpenJudge NOI 2.1 1661:Bomb Game

【题目翻译】

题目

炸弹游戏

描述

Bosko和Susko在一个有A行B列组成的矩形棋盘上玩一个有趣的游戏。
当游戏开始时,Susko将他的虚拟碉堡放在棋盘的某一位置,然后Bosko选择某一区域扔他的虚拟炸弹。在每一次爆炸之后,Susko将会告诉Bosko他的碉堡是否在爆炸的范围中。
扔在(R, S)的炸弹的爆炸范围是边长为P的正方形(P总是奇数)。正方形的中心在(R, S),正方形的边与棋盘的边平行,长度为P。
在已经扔下一些炸弹之后, Bosko应该找出Susko碉堡的位置,然而这个位置可能不是唯一的,你的任务是帮助Bosko计算出可能的位置的数量。

输入

第一行包含三个整数A,B,和K(1 <= A, B, K <=100.)A表示行的数量,B表示列的数量,K表示扔炸弹的数量。
接下来的K行包含了整数R, S, P 和T,描述了在第R行和第S列处投掷的炸弹,直径为P,1 <= R < = A,1 < = S < = B,1 < = P < = 99,P为奇‎‎数。如果碉堡在这个炸弹的范围内,T等于1;否则为 0。‎

输出

‎输出Susko的碉堡可能存在的位置的数量。‎

样例输入

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

样例输出

5

来源

Croatia OI 2002 National – Juniors

【题目考点】

1. 枚举

【解题思路】

枚举棋盘上的所有位置,假设碉堡存在于枚举出的一个位置,看此时炸弹轰炸的结果是否与给定的结果是相同的。如果所有炸弹轰炸后的结果与给定的结果都是相同的,那么当前碉堡所在的位置就是一个碉堡可能存在的位置,碉堡可能存在的位置计数加1。
最后输出碉堡可能存在的位置数量。

【题解代码】

#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Bomb
{
    
    
    int r, s, p, t;
    int isCover(int x, int y)//(x,y)位置是否在该炸弹的爆炸范围之内 
    {
    
    
        if(abs(x - r) <= p / 2 && abs(y - s) <= p / 2)
            return 1;
        else
            return 0;
    }
};
Bomb bm[N];//bm[i]:第i个炸弹 
int main()
{
    
    
    int a, b, k, ans = 0;//ans:可能的位置数 
    cin >> a >> b >> k;
    for(int i = 1; i <= k; ++i)
        cin >> bm[i].r >> bm[i].s >> bm[i].p >> bm[i].t;
    for(int i = 1; i <= a; ++i)
        for(int j = 1; j <= b; ++j)//假设碉堡在(i,j) 
        {
    
    
            bool isPos = true;//碉堡是否可能在(i,j) 
            for(int h = 1; h <= k; ++h)
            {
    
    
                if(bm[h].isCover(i, j) != bm[h].t)//如果这个炸弹对(i,j)的覆盖结果与输入的预设的结果不同 
                {
    
    
                    isPos = false;
                    break;
                }
            }
            if(isPos)
                ans++;
        }
    cout << ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lq1990717/article/details/125630031