1 条题解

  • 0
    @ 2025-8-24 21:30:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 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
    上传者