牛客小白月赛4 C 病菌感染
链接:https://www.nowcoder.com/acm/contest/134/C
来源:牛客网
题目描述
铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们。
培养皿可以被看成一个n*n的方格,最初病菌滴在了这n*n的格子中的某些格子,病菌的传染方式是这样的,如果一个方格与两个或多个被感染的方格相邻(两个方格相邻当且仅当它们只有一条公共边),
那么它就会被感染。现在铁子和顺溜想知道,最终所有的方格会不会都被感染。
输入描述:
第一行两个整数n,m。n表示方格的规格,m表示最初病菌所在的格子数。(1 ≤ n ≤ 1000, 0 < m < n)。
接下来m行每行两个整数xi,yi表示第xi行的第yi个格子有病菌。
数据保证不会有两个病菌初始时在同一个格子。
输出描述:
如果最终所有的方格都会被感染,输出 YES。
否则输出 NO。
示例1
输入
3 2
1 2
2 2
输出
NO
题解+AC代码:
//还挺简单的,按第一行逐列遍历第j列的副对角线上和j+2列的副对角线,处理一下就好了。
//但是官方题解说,因为周长一定,无论怎么输入答案都是NO。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
int wap[1001][1001];
int main()
{
while (cin >> n >> m)
{
memset(wap, 0, sizeof(wap));
int x, y;
for (int i = 1; i <= m; ++i)
{
cin >> x >> y;
wap[x][y] = 1;
}
int k;
for (int i = 1; i <= m; ++i)
{
k = 1;
for (int j = i; j >= 1; --j)
{
if (wap[k][j] == 1 && wap[k + 1][j - 1] == 1 && k + 1 <= n && j - 1 >= 1)
{
wap[k][j - 1] = 1;
wap[k + 1][j] = 1;
}
else if (wap[k][j] == 1 && wap[k + 1][j + 1] == 1 && k + 1 <= n && j + 1 <=n)
{
wap[k][j + 1] = 1;
wap[k + 1][j] = 1;
}
}
}
int node = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (!wap[i][j])
{
node = 1;
break;
}
}
}
if (node)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}
今天也是元气满满的一天,good luck Ikefire;
我想要变得高一点,最好能伸手给你一片天。