洛谷-P1789 【Mc生存】插火把

洛谷-P1789 【Mc生存】插火把

原题链接:https://www.luogu.com.cn/problem/P1789


题目描述

话说有一天 linyorson 在“我的世界”开了一个 (n imes n(nle 100)) 的方阵,现在他有 (m) 个火把和 (k) 个萤石,分别放在 ((x_1,y_1)...(x_m,y_m))((o_1,p_1)...(o_k,p_k)) 的位置,没有光或没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物?

P.S.火把的照亮范围是:

    |暗|暗| 光 |暗|暗|
    |暗|光| 光 |光|暗|
    |光|光|火把|光|光|
    |暗|光| 光 |光|暗|
    |暗|暗| 光 |暗|暗|

萤石:

    |光|光| 光 |光|光|
    |光|光| 光 |光|光|
    |光|光|萤石|光|光|
    |光|光| 光 |光|光|
    |光|光| 光 |光|光|

输入格式

输入共m+k+1行。

第一行为n,m,k。

第2到第m+1行分别是火把的位置xi yi。

第m+2到第m+k+1行分别是萤石的位置oi pi。

注:可能没有萤石,但一定有火把。

所有数据保证在int范围内。

输出格式

有几个点会生出怪物。

输入输出样例

输入 #1

5 1 0
3 3

输出 #1

12

C++代码

#include <iostream>
#include <cmath>
using namespace std;

int a[101][101];
struct node {
    int x, y;
};

int main() {
    int n, m, k, ans=0;
    cin >> n >> m >> k;
    node torch[m], fluorite[k];
    for (int i=0; i<m; ++i)
        cin >> torch[i].x >> torch[i].y;
    for (int i=0; i<k; ++i)
        cin >> fluorite[i].x >> fluorite[i].y;
    for (int i=0; i<m; ++i)
        for (int p=-2; p<=2; ++p)
            for (int q=-2; q<=2; ++q) {
                int xx = torch[i].x + p;
                int yy = torch[i].y + q;
                if (xx<1 || xx>n || yy<1 || yy>n)
                    continue;
                if (abs(p) + abs(q) <= 2)
                    a[xx][yy] = 1;
            }
    for (int i=0; i<k; ++i)
        for (int p=-2; p<=2; ++p)
            for (int q=-2; q<=2; ++q) {
                int xx = fluorite[i].x + p;
                int yy = fluorite[i].y + q;
                if (xx<1 || xx>n || yy<1 || yy>n)
                    continue;
                a[xx][yy] = 1;
            }
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            if (a[i][j] == 0)
                ++ans;
    cout << ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/yuzec/p/13370052.html