题目描述
给你一个二维数组,里面有很多小正方形组成,有白色“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;
}