对于一个01矩阵A,求其中有多少片连成一片的1. 每个1可以和上下左右的1相连.
请为下面的Solution类实现解决这一问题的函数countConnectedOnes,函数参数A为给出的01矩阵,A的行数和列数均不大于1000. 函数的返回值是问题的答案.
class Solution {
public:
int countConnectedOnes(vector<vector<char>>& A) {
}
};
例1:
A=
100
010
001
答案为3.例2:
A=
1101
0101
1110
答案为2.注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码. 注意不要修改类和函数的名称.
这道题的本质就是用DFS求连通块,从每个1开始遍历它周围的1,每次访问都将其写上一个连通分量的编号part_number,具体代码如下:
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
char num[1005][1005];
int part_number[1005][1005] = {0};
void dfs(int row, int col, int id, int rn, int cn){
if(row < 0 || row >= rn || col < 0 || col >= cn) return;
if(part_number[row][col] > 0 || num[row][col] == '0') return;
part_number[row][col] = id;
for(int dr = -1; dr <= 1; dr++){
for(int dc = -1; dc <= 1; dc++){
if(dr+dc == 1 || dr+dc == -1)
dfs(row+dr,col+dc,id,rn,cn);
}
}
}
class Solution {
public:
int countConnectedOnes(vector<vector<char> >& A) {
int count = 0;
int cn = A[0].size();
int rn = A.size();
for(int i = 0; i < rn; i++){
for(int j = 0; j < cn; j++){
num[i][j] = A[i][j];
}
}
for(int i = 0; i < rn; i++){
for(int j = 0; j < cn; j++){
if(part_number[i][j] == 0 && num[i][j] == '1'){
count++;
dfs(i,j,count,rn,cn);
}
}
}
return count;
}
};