Problem Description
给定一个数字矩阵,如果上下左右数值相同,则表示是一个连通的区域。求矩阵中连通块的数量。
Input
输入有多组测试实例,每组输入有两行。第一行是两个整数n、m,表示矩阵的行数、列数,接下来输入的是n*m阶矩阵,矩阵中的元素用空格隔开。当输入的n、m都是0时结束
Output
输出该矩阵中的连通块的数量,每组输出占一行
Sample Input
5 6
4 4 4 4 4 4
4 2 3 3 1 4
4 2 2 3 1 4
4 2 3 3 1 4
4 4 4 4 4 4
Sample Output
4
#include "bits/stdc++.h"
using namespace std;
#define N 1024
int ans=0;
int graph[N][N];
int visit[N][N];
int m,n;
typedef pair<int,int> p;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void bfs(int x,int y,int m,int n){
queue<p> q;
q.push(p(x,y));
int val=graph[x][y];
while(!q.empty()){
p temp=q.front();
int i=temp.first;
int j=temp.second;
q.pop();
visit[i][j]=true;
for(int k=0;k<4;k++){
int nowx=i+dx[k];
int nowy=j+dy[k];
if(nowx>=0&&nowx<m){
if(nowy>=0&&nowy<n){
if(visit[nowx][nowy]==false)
if(graph[nowx][nowy]==val){
q.push(p(nowx,nowy));
}
}
}
}
}
}
int main(void) {
while(scanf("%d %d",&m,&n)!=EOF){
if(m==0&&n==0)continue;
ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
visit[i][j]=false;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&graph[i][j]);
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(visit[i][j]==false){
ans++;
bfs(i,j,m,n);
}
}
}
cout<<ans<<endl;
}
return 0;
}