一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
4 10
0234500067
1034560500
2045600671
0000000089
有4个细胞。
【输入】
第一行为矩阵的行n和列m;
下面为一个n×m的矩阵。
【输出】
细胞个数。
【输入样例】
4 10
0234500067
1034560500
2045600671
0000000089
【输出样例】
4
# include<iostream>
# include<cstdio>
# include<cstring>
# include<queue>
using namespace std;
const int maxn=100;
char maze[maxn][maxn];
struct point{
int x,y;
};
int vis[maxn][maxn];
int n,m;
queue<point> s;
/*void dfs(int x,int y,int cnt)
{
if(x<0||x>=n||y<0||y>=m)
return ;
if(vis[x][y]>0||maze[x][y]=='0')
return ;
vis[x][y]=cnt;
if(x+1<n&&maze[x+1][y])
dfs(x+1,y,cnt);
if(y+1<m&&maze[x][y+1])
dfs(x,y+1,cnt);
if(x-1>=0&&maze[x-1][y])
dfs(x-1,y,cnt);
if(y-1>=0&&maze[x][y-1])
dfs(x,y-1,cnt);
}*/
void bfs(int x,int y,int cnt)
{
point w;
w.x=x;
w.y=y;
vis[x][y]=cnt;
s.push(w);
while(!s.empty())
{
point p=s.front();
s.pop();
if(p.x+1<n&&!vis[p.x+1][p.y]&&maze[p.x+1][p.y]!='0')
{
point yy;
yy.x=p.x+1;
yy.y=p.y;
vis[yy.x][yy.y]=cnt;
s.push(yy);
}
if(p.y+1<m&&!vis[p.x][p.y+1]&&maze[p.x][p.y+1]!='0')
{
point yy;
yy.x=p.x;
yy.y=p.y+1;
vis[yy.x][yy.y]=cnt;
s.push(yy);
}
if(p.y-1>=0&&!vis[p.x][p.y-1]&&maze[p.x][p.y-1]!='0')
{
point yy;
yy.x=p.x;
yy.y=p.y-1;
vis[yy.x][yy.y]=cnt;
s.push(yy);
}
if(p.x-1>=0&&!vis[p.x-1][p.y]&&maze[p.x-1][p.y]!='0')
{
point yy;
yy.x=p.x-1;
yy.y=p.y;
vis[yy.x][yy.y]=cnt;
s.push(yy);
}
}
}
int main()
{
int cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>maze[i];
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!vis[i][j]&&maze[i][j]!='0') {
//dfs(i,j,++cnt);
bfs(i,j,++cnt);
}
}
}
cout<<cnt<<endl;
return 0;
}
总结:
(1)注意边界的讨论.