链接:https://www.nowcoder.com/acm/contest/134/C
来源:牛客网
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 int a[N][N],dir[2][4]={{-1,0,1,0},{0,1,0,-1}};//四周的格子 5 int n,m,sum; 6 7 bool judge(int x,int y)//判断周围的病菌数 8 { 9 int xx,yy,i; 10 sum=0;//周围病菌数 11 for (i=0;i<4;i++) 12 { 13 xx=x+dir[0][i]; 14 yy=y+dir[1][i]; 15 if (xx<1||xx>n||yy<1||yy>n)//超出范围 16 { 17 continue; 18 } 19 if (a[xx][yy]==1) 20 { 21 sum++; 22 } 23 } 24 if (sum>=2) 25 { 26 return true; 27 } 28 return false; 29 } 30 31 void bfs(int i,int j)//广搜标记被感染的格子 32 { 33 if (i<=0||i>n||j<=0||j>n||false==judge(i,j)||a[i][j]==1)//若无a[i][j]==1则会死循环 34 { 35 return; 36 } 37 38 if (true==judge(i,j)) 39 { 40 a[i][j]=1; 41 bfs(i,j-1); 42 bfs(i,j+1); 43 bfs(i-1,j); 44 bfs(i+1,j); 45 } 46 } 47 48 void test() 49 { 50 int i,j; 51 for (i=1;i<=n;i++) 52 { 53 for (j=1;j<=n;j++) 54 { 55 printf("%d",a[i][j]); 56 } 57 printf("\n"); 58 } 59 } 60 61 void solve() 62 { 63 int i,j,r,l; 64 memset(a,0,sizeof(a)); 65 for (i=0;i<m;i++) 66 { 67 scanf("%d %d",&r,&l); 68 a[r][l]=1; 69 } 70 // test(); 71 for (i=1;i<=n;i++) 72 { 73 for (j=1;j<=n;j++) 74 { 75 if (a[i][j]==0) 76 { 77 bfs(i,j); 78 } 79 } 80 } 81 for (i=1;i<=n;i++)//看是否全部被感染 82 { 83 for (j=1;j<=n;j++) 84 { 85 if (a[i][j]==0) 86 { 87 printf("NO\n"); 88 return; 89 } 90 } 91 } 92 printf("YES\n"); 93 return; 94 } 95 96 int main() 97 { 98 while (scanf("%d %d",&n,&m)!=EOF) 99 { 100 solve(); 101 // test(); 102 } 103 104 return 0; 105 }