【科创网试题】细胞
细胞 |
难度级别:A; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B |
试题描述
|
一个n*m的矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为:沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
|
输入
|
第一行输入两个数n和m。
接下来的n行m列输入矩阵,由0到9组成。 |
输出
|
输出矩阵里的细胞个数
|
输入示例
|
4 10
0234500067 1034560500 2045600671 0000000089 |
输出示例
|
4
|
其他说明
|
1<=n,m<=1,000,000
此题由YSF出品~ |
#include<iostream> #include<cstring> #include<queue> #include<cstdio> using namespace std; const int gx[4]={0,0,-1,1}; const int gy[4]={1,-1,0,0}; int m,n,tot=0; bool a[110][110]; void init(); void work(int,int); int main() { init(); for(int i=1;i<=m;i++)//枚举整个m*n矩阵 for(int j=1;j<=n;j++) if(a[i][j])work(i,j);//找到一个细胞,并对该细胞进行处理 cout<<tot<<endl; return 0; } void work(int x,int y) { queue<int> qx,qy;//两队列分别存储当前点的行和列 int x1,y1; tot++;//细胞数加一 qx.push(x);//把当前细胞的行和列入队 qy.push(y); a[x][y]=0;//当前细胞因为已计算,赋为false while(!qx.empty())//当队列非空 { for(int i=0;i<4;i++)//对当前细胞的上下左右进行搜索 { x1=qx.front()+gx[i]; y1=qy.front()+gy[i]; if(x1>0&&x1<=m&&y1>0&&y1<=n&&a[x1][y1]) { qx.push(x1);//如果没有越界且(x1,y1)为细胞 ,入队 qy.push(y1); a[x1][y1]=false; } } qx.pop();//for循环结束,a[x][y]相邻细胞处理完成,则 将其出队 qy.pop(); } } void init() { string s; cin>>m>>n; for(int i=1;i<=m;++i) { cin>>s; for(int j=0;j<n;++j) if(s[j]=='0')a[i][j+1]=0; else a[i][j+1]=1; } }