求细胞数量
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?
输入格式
输入整数m,n(m行,n列)矩阵
输出格式
输出细胞的个数
输入输出样例
输入
4 10
0234500067
1034560500
2045600671
0000000089
输出
4
笔记
队列操作:
deque< int > q;创建一个数双端队列q,int也可以是别的类型
q.empty();判断队列是否为空,为空返回true
q.push_front(s);将s从队头入队
q.push_back(s);将s从队尾入队,和普通队列方式一样
q.front();返回队头元素
q.back();返回队尾元素
q.pop_front();将队头元素弹出
q.pop_back;将队尾元素弹出
q.clear();将队列清空
bfs模板
↓↓↓↓↓↓↓
struct zb
{
...
}
deque<zb> q;
void bfs()
{
标记起点
起点入队列
while(!q.empty())//队列不为空
{
zb now=q.front();//返回队首
for(拓展出接下来可能的状态)
{
zb next;
记录这一状态
判断状态是否合法
标记状态
q.push_back(next);//状态入队列
}
q.pop_front();//弹出队首
}
}
C++第一遍
没用deque
#include <iostream>
using namespace std;
struct zuobiao{
int x,y;
}q[10000];
int ans;
int c[4][2]={0,-1,1,0,0,1,-1,0};
bool shu[101][101],b[101][101];
int bfs(int x,int y)
{
int f=0,r=1;
q[1].x=x;
q[1].y=y;
while(f<r)
{
f++;
b[q[f].x][q[f].y]=true;
x=q[f].x;
y=q[f].y;
for(int i=0;i<4;i++)
{
int xx=x+c[i][0];
int yy=y+c[i][1];
if(shu[xx][yy]!=false&&b[xx][yy]==false)
{
q[++r].x=xx;
q[r].y=yy;
}
}
}
}
int main()
{
int m,n;
char in;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>in;
if(in!='0') shu[i][j]=true;//q[i][j]=(in!='0')
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(shu[i][j]!=false&&b[i][j]==false)
{
bfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
C++第二遍
用了deque
#include <iostream>
#include <deque>
using namespace std;
struct zb{
int x,y;
};
bool ling[101][101],used[101][101];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
deque<zb> q;
int ans;
void bfs(int x,int y)
{
used[x][y]=true;//标记
zb s;
s.x=x; s.y=y;
q.push_back(s);//入栈
while(!q.empty())//判队是否为空
{
zb n=q.front();//取头元素
for(int i=0;i<4;i++)//查找4个方位
{
zb next=n;
next.x+=dx[i];
next.y+=dy[i];
if(ling[next.x][next.y]==true&&used[next.x][next.y]==false)//判断是否为零并且被标记
{
used[next.x][next.y]=true;//满足条件,标记
q.push_back(next);//入队尾
}
}
q.pop_front();//出队首元素
}
}
int main()
{
int m,n;
cin>>m>>n;
char in;
for(int i=1;i<=m;i++) //输入
{
for(int j=1;j<=n;j++)
{
cin>>in;
if(in!='0') ling[i][j]=true;
}
}
for(int i=1;i<=m;i++) //一个个判断
{
for(int j=1;j<=n;j++)
{
if(ling[i][j]==true&&used[i][j]==false)
{
bfs(i,j);
ans++; //满足条件答案+1
}
}
}
cout<<ans<<endl;//输出答案
return 0;
}