二维数组搜索

题目描述

给你一个二维数组,里面有很多小正方形组成,有白色“0”,有黑色的“1”, 请你找出有几个个黑色的格子(如果1相连,能通过上下左右到达 ,就算一个)

样例输入输出

输入

3 3

1 1 1

0 1 0

1 0 1

输出

3

解释 

二维数组应该都明白

第一步:输入(easy)

cin>>n>>m;//长和宽
for(int i=0;i<n;i++)
{
    for(int j=0;j<m;j++)
    {
        cin>>mp[i][j];//二维数组
    }
}

第二步:调用及输出(easy)

int sum=0;//计数变量
for(int i=0;i<n;i++)
{
    for(int j=0;j<m;j++)
    {
        if(mp[i][j]==1)//如果这一位是一
        {
            f(i,j);//调用函数,函数在下面讲
            sum++;//计算器++
        }
    }
}
cout<<sum;//输出

!!!重点!!!

第三步:函数(very very hard)

    int mp[100][100];//数组存二维数组的
    int leeft[4]={0,0,1,-1};//上下左右移动数组x坐标
    int riight[4]={1,-1,0,0};//上下左右移动数组y坐标
    int n,m;//长宽
    void f(int x,int y)
    {
        int front = -1;//模拟队列头指针
        int tail = 0;//模拟队尾头指针
        int queue[100][2];
        queue[tail][0]=x;//放入第一个数x坐标
        queue[tail][1]=y;//放入第一个数y坐标
        
        while(front<tail){
            ++front;//头++(弹出)
            int x1 = queue[front][0];//第一个数x坐标
            int y1 = queue[front][1];//第一个数y坐标
            
            for(int i=0;i<4;i++){
                int xx=x1+leeft[i];//上下左右模拟移动
                int yy=y1+riight[i];//上下左右模拟移动
                if(xx>=0&&xx<n&&yy>=0&&xx<m&&mp[xx][yy]==1)//判断是否出界
                {
                    tail++;//(放入)
                    queue[tail][0]=xx;
                    queue[tail][1]=yy;
                    mp[xx][yy]=0;//处理后等于0
                }
            }
        }
    }

完整代码(尽量不看)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int mp[100][100];
int leeft[4]={0,0,1,-1};
int riight[4]={1,-1,0,0};
int n,m;
void f(int x,int y)
{
    int front = -1;
    int tail = 0;
    int queue[100][2];
    queue[tail][0]=x;
    queue[tail][1]=y;    
    while(front<tail)
	{
        ++front;
        int x1 = queue[front][0];
        int y1 = queue[front][1];
        for(int i=0;i<4;i++)
		{
            int xx=x1+leeft[i];
            int yy=y1+riight[i];
            if(xx>=0&&xx<n&&yy>=0&&xx<m&&mp[xx][yy]==1)
            {
                tail++;
                queue[tail][0]=xx;
                queue[tail][1]=yy;
               mp[xx][yy]=0;
            }
        }
    }
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
	    for(int j=0;j<m;j++)
	    {
	        cin>>mp[i][j];
	    }
	}
	int sum=0;
	for(int i=0;i<n;i++)
	{
	    for(int j=0;j<m;j++)
	    {
	        if(mp[i][j]==1)
	        {
	            f(i,j);
	            sum++;
	        }
	    }
	}
	cout<<sum;
}

谢谢

发布了42 篇原创文章 · 获赞 6 · 访问量 6662

猜你喜欢

转载自blog.csdn.net/TigerJoez/article/details/103940551