牛客小白月赛4-C-病毒感染 推论或BFS

https://www.nowcoder.com/acm/contest/134/C

题解是个结论:全是NO!!!

#include <stdio.h>
int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++)
        scanf("%d%d",&n,&n);
    puts("NO");
    return 0;
}

我是用BFS写的,当时一看到这道题就觉得像徐州邀请赛的第一题,心里想着会不会又是简单充大头卡STL。

题解:

1、最简单的就是推出不可能全部感染的这个事实。

2、BFS思路就是每个感染的四周扩散的时候判断即将要感染的点是否四周有两个以上感染点,是才感染,不是就不能被感染。

#include <bits/stdc++.h>
using namespace std;
bool a[1005][1005];
int dix[1000005],diy[1000005];
int next1[4][2] = {{0,-1},{0,1},{1,0},{-1,0} };
int main() {
    int n,m,x,y,tag = 0;
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++) {
        scanf("%d%d",&x,&y);
        a[x][y] = true;
        dix[tag] = x;
        diy[tag] = y;
        tag++;
    }
    int k = 0;
    while(k < tag) {
        x = dix[k];
        y = diy[k];
        for(int i = 0;i < 4;i++) {
            int rx = x + next1[i][0];
            int ry = y + next1[i][1];
            if(rx < 1 || rx > n || ry < 1 || ry > n || a[rx][ry] == true)
                continue;
            int cnt = 0;
            for(int j = 0;j < 4;j++) {
                int tx = rx + next1[i][0];
                int ty = ry + next1[i][1];
                if(tx < 1 || tx > n || ty < 1 || ty > n)
                    continue;
                if(a[tx][ty] == true)
                    cnt++;
            }
            if(cnt >= 2) {
                a[rx][ry] = true;
                dix[tag] = rx;
                diy[tag] = ry;
                tag++;
            }
        }
        k++;
    }
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= n;j++) {
            if(a[i][j] == false) {
                cout << "NO" << endl;
                return 0;
            }
        }
    }
    cout << "YES" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a912952381/article/details/80717589
今日推荐