题目:
给出一个 m x n 的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置是 相邻的。如果矩阵中有若干个 1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵中“块”的个数。
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
例如上面的 6 x 7的矩阵中,“块”的个数为4。
输入格式:
第一行给出 m,n(1<=m,n<= 20)分别表示矩阵的行,列。
每一行给出 n个数(0或者1),共m行。
输出格式:
输出矩阵中“块”的个数。
输入样例:
6 7
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
输出样例:
4
#include <iostream>
#include <queue>
using namespace std;
const int maxn=100;
int n,m;
int matrix[maxn][maxn];
bool inq[maxn][maxn]={false};
int X[]={0,0,1,-1};
int Y[]={1,-1,0,0};
bool judge(int x,int y){
if(x>=n||x<0||y>=m||y<0) return false;
if(matrix[x][y]==0||inq[x][y]==true) return false;
return true;
}
void dfs(int x,int y){
for(int i=0;i<4;i++){
if(judge(x+X[i],y+Y[i])==true){
inq[x+X[i]][y+Y[i]]=true;
dfs(x+X[i],y+Y[i]);
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>matrix[i][j];
}
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(matrix[i][j]==1&&inq[i][j]==false){
ans++;
dfs(i,j);
}
}
}
cout<<ans<<endl;
return 0;
}