题目描述
对于一个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
遍历矩阵找入口,往上下左右四个方向深搜,可以到达的点就是同一块的,标记访问状态。
注意: 本题中vector使用char并不是为了节省空间,而是说其中的1是字符串'1'
。
AC代码
// Problem#: 20619
// Submission#: 5146289
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
class Solution {
public:
void dfs(int sRow, int sCol, vector<vector<bool> >& isVisited,
const vector<vector<char> >& A) {
int row = isVisited.size();
int col = isVisited[0].size();
if (sRow < 0 || sRow >= row || sCol < 0 || sCol >= col)
return;
if (A[sRow][sCol] != '1' || isVisited[sRow][sCol])
return;
isVisited[sRow][sCol] = true;
// up, right, down, left
int DIRE[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
// move four directions
for (int i = 0; i < 4; ++i) {
dfs(sRow + DIRE[i][0], sCol + DIRE[i][1], isVisited, A);
}
}
int countConnectedOnes(vector<vector<char> >& A) {
int row, col;
if (A.empty()) return 0; else row = A.size();
if (A[0].empty()) return 0; else col = A[0].size();
vector<vector<bool> > isVisited;
for (int i = 0; i < row; ++i) {
vector<bool> temp;
for (int j = 0; j < col; ++j) {
temp.push_back(false);
}
isVisited.push_back(temp);
}
int ans = 0;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (A[i][j] == '1' && !isVisited[i][j]) {
dfs(i, j, isVisited, A);
ans++;
}
}
}
return ans;
}
};