1. 程式人生 > >牛客小白月賽4-C-病毒感染 推論或BFS

牛客小白月賽4-C-病毒感染 推論或BFS

題解是個結論:全是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;
}