二维数组八个方向的判断--牛客刷题1023-病菌感染

2024-03-09 05:10

本文主要是介绍二维数组八个方向的判断--牛客刷题1023-病菌感染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们。
培养皿可以被看成一个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

这篇关于二维数组八个方向的判断--牛客刷题1023-病菌感染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/789611

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,