题解:洛谷 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
浙公网安备 33010602011771号