题解:洛谷 P1789 【Mc生存】插火把

【题目来源】

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

【题目描述】

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

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

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

萤石:

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

【输入】

输入共 \(m+k+1\) 行。

第一行为 \(n,m,k\)

\(2\) 到第 \(m+1\) 行分别是火把的位置 \(x_i,y_i\)

\(m+2\) 到第 \(m+k+1\) 行分别是萤石的位置 \(o_i,p_i\)

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

【输出】

有几个点会生出怪物。

【输入样例】

5 1 0
3 3

【输出样例】

12

【算法标签】

《洛谷 P1789 插火把》 #模拟# #洛谷原创#

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

int main()
{
    int n, m, k;                // 定义变量:网格大小n×n,m个路灯,k个临时照明
    int a[105][105] = {0};      // 定义二维数组:标记网格照明状态(0未照亮,1照亮)
    int x, y;                   // 定义变量:临时存储坐标
    int ans = 0;                // 定义变量:未被照亮的格子计数
  
    cin >> n >> m >> k;         // 输入网格大小、路灯数和临时照明数
  
    // 处理路灯照明范围
    for (int i = 0; i < m; i++) 
    {
        cin >> x >> y;          // 输入路灯坐标
      
        // 照亮十字区域(上下左右各两格)
        for (int j = x - 2; j <= x + 2; j++) 
            if (j >= 0) a[j][y] = 1;
        for (int j = y - 2; j <= y + 2; j++) 
            if (j >= 0) a[x][j] = 1;
      
        // 照亮四个对角格子
        a[x - 1][y - 1] = 1;
        a[x + 1][y - 1] = 1;
        a[x - 1][y + 1] = 1;
        a[x + 1][y + 1] = 1;
    }
  
    // 处理临时照明范围
    for (int i = 0; i < k; i++) 
    {
        cin >> x >> y;          // 输入临时照明坐标
      
        // 照亮5×5的正方形区域
        for (int p = x - 2; p <= x + 2; p++) 
        {
            for (int q = y - 2; q <= y + 2; q++) 
            {
                if (p >= 0 && q >= 0) 
                    a[p][q] = 1;
            }
        }
    }
  
    // 统计未被照亮的格子数量
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= n; j++) 
        {
            if (a[i][j] == 0) 
                ans++;
        }
    }
  
    cout << ans;                // 输出未被照亮的格子总数
  
    return 0;                   // 程序正常结束
}

【运行结果】

5 1 0
3 3
12
posted @ 2026-02-16 15:50  团爸讲算法  阅读(2)  评论(0)    收藏  举报