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; }