铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们。
培养皿可以被看成一个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
我们先去分析题的大意
- 一个n*n的方格 :明显是个矩阵----> 要用到二维数组了
- ,如果一个方格与两个或多个被感染的方格相邻(两个方格相邻当且仅当它们只有一条公共边),那么它就会被感染。现在铁子和顺溜想知道,最终所有的方格会不会都被感染
- 这个说明的是病毒是在四个方向上进行的,上 下 左 右:
- 接下来m行每行两个整数xi,yi表示第xi行的第yi个格子有病菌。
- 数据保证不会有两个病菌初始时在同一个格子。 --------->是说输入坐标
其实说到这里,大致是有自己的方向来判断了,就是在上下左右四个方向上来判断呗,为了便于理解,我按照题意打印出如下图形,0(病毒),那么我就开始去走起
这个是便于理解,但是在做题的时候,为了方便,我直接把所有的元素变成了0,那么是病毒是则是1,然后我在遍历中走一圈的时候,可以来进行加法,当大于2时,就说明你的周围是最少有三个病毒,然后就被感染,然后在遍历走去
while (m > 0) {
cin >> x >> y;
arr[x][y] = 1;
m--;
}for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (arr[i][j] != 1) { //上下左右四个方向的判断
t = arr[i][j] + arr[i][j + 1] + arr[i][j - 1] + arr[i + 1][j] + arr[i - 1][j];
if (t < 2){cout << "NO" << endl; return 0;}
}}
}
cout<<"YES"<<endl;
return 0;
全部的代码如下
#include <iostream>
#include <iomanip>
#define N 1001
using namespace std;
int main()
{
int arr[N][N] = {0};
int n, m, i, j, x, y,t, flag = 0;
cin >> n >> m;
while (m > 0) {
cin >> x >> y;
arr[x][y] = 1;
m--;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (arr[i][j] != 1) { //上下左右四个方向的判断
t = arr[i][j] + arr[i][j + 1] + arr[i][j - 1] + arr[i + 1][j] + arr[i - 1][j];
if (t < 2){cout << "NO" << endl; return 0;}
}
}
}
cout<<"YES"<<endl;
return 0;
return 0;
}
经过这个想一下如果八个方向呢?
我开始的时候是思考的是八个方向,最开始的时候想的没有那么完善,是这样的
num = 0;
if (0 != arr[i][j + 1]) num++;// 右
if (0 != arr[i][j - 1]) num++;//左
if (0 != arr[i+1][j]) num++;//下
if (0 != arr[i-1][j]) num++;//上
if (0 != arr[i+1][j + 1]) num++; //右下
if (0 != arr[i+1][j-1]) num++;//左下
if (0 != arr[i-1][j + 1]) num++; //左下
if (0 != arr[i-1][j - 1]) num++;//左上
//if (num > 6&&arr[i][j]!=0) cout << arr[i][j]<<endl;
if (num > 6 && arr[i][j] != 0) flag = 1;
我对八个方向来分析,如果说 他们在这个方向上有不是0的那就说明没有病毒,当没有病毒是的个数大于六时候说明就不能被感染,然后我前边还设置一个flag呢,只要有一个不被感染那就说明不被感染,那就当然是 NO 下面的这个不完整哈,只是一个想法而已,仅供参考
#include <iostream>
#include <iomanip>
#define N 101
using namespace std;
int main()
{
int arr[N][N];
int n,m,i,j,t=1,x,y,num,flag=0;
cin >> n>>m;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
arr[i][j]=t++;
}
}
while (m > 0) {
cin >> x >> y;
arr[x][y] = 0;
m--;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
num = 0;
if (0 != arr[i][j + 1]) num++;// 右
if (0 != arr[i][j - 1]) num++;//左
if (0 != arr[i+1][j]) num++;//下
if (0 != arr[i-1][j]) num++;//上
if (0 != arr[i+1][j + 1]) num++; //右下
if (0 != arr[i+1][j-1]) num++;//左下
if (0 != arr[i-1][j + 1]) num++; //左下
if (0 != arr[i-1][j - 1]) num++;//左上
//if (num > 6&&arr[i][j]!=0) cout << arr[i][j]<<endl;
if (num > 6 && arr[i][j] != 0) flag = 1;
}
}
if (flag == 1) cout << "YES"<<endl;
else cout << "NO" << endl;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cout<< arr[i][j]<<setw(4);
}
cout <<"\n";
}
return 0;
}
1