1 条题解
-
0
自动搬运
来自洛谷,原作者为

CYJian
今日はこっちの地方はどしゃぶりの晴天でした,昨日もずっと暇で一日満喫してました搬运于
2025-08-24 21:30:21,当前版本为作者最后更新于2017-11-01 19:57:45,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思路很简单:从每一个火把或萤石为中心枚举每一个有亮光的地方,标记后统计没有标记的地方的个数即可。。
但是。。
直接暴力写的话。。
少则六七十行,
多则。。(不忍直视的长。。)
所以,为了代码简洁,
我就为大家带来高强度for的自带注释的压缩版本:
(当当当当)
#include <bits/stdc++.h> using namespace std; int n, m, k, a, b, ans; int s[5005][5005]; bool pd(int x, int y) { //判断是否越界 if(x < 1 || y < 1 || x > n || y > n) return 0; return 1; } int main() { scanf("%d%d%d", &n, &m, &k); //读入 for(int i = 1; i <= m + k; i++) { //由于计算火把和萤石的步骤很像,所以合并了 scanf("%d%d", &a, &b); //读入坐标 for(int x = -2; x <= 2; x++) for(int y = -2; y <= 2; y++) //枚举5*5的方阵(通过计算距离) if((i > m || abs(x) + abs(y) <= 2) && pd(x + a, b + y)) //如果是萤石(i > m)或者x与y的坐标差的和不超过2(想一想为什么)并且 //没有越界就标记 s[x + a][b + y]++; } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) ans += s[i][j] == 0; //枚举每一个方格,看看是不是==0(即没有亮光) printf("%d\n", ans); //输出结果 return 0; } //希望我能帮到各位。。 //希望大慈大悲的管理员给过。。
- 1
信息
- ID
- 760
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 1
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者