问题:
public:
int countConnectedOnes(vector<vector<char>>& A) {
int counts = 0;
int height = A.size(),width = A[0].size();
if(height <= 0 || width <= 0)
vector<int> temp;
for(int j = 0;j < width;j++)
temp.push_back(0);
for(int i = 0; i < height;i++){
isCount.push_back(temp);
addCount(i,j,isCount,A);
counts++;
}
}
}
return counts;
}
void addCount(int currentCol,int currentRow,vector<vector<int>> isCount,vector<vector<char>> A){
int height = A.size(),width = A[0].size();
if(currentCol >= height|| currentRow >= width || isCount[currentCol][currentRow] == 1)
return;
addCount(currentCol - 1,currentRow,isCount,A);
if(A[currentCol + 1][currentRow] == '1' && isCount[currentCol + 1][currentRow] == 0)
addCount(currentCol + 1,currentRow,isCount,A);
if(A[currentCol][currentRow - 1] == '1' && isCount[currentCol][currentRow - 1] == 0)
addCount(currentCol,currentRow - 1,isCount,A);
if(A[currentCol][currentRow + 1] == '1' && isCount[currentCol][currentRow + 1] == 0)
addCount(currentCol,currentRow + 1,isCount,A);
}
};
对于一个01矩阵A,求其中有多少片连成一片的1. 每个1可以和上下左右的1相连.
请为下面的Solution类实现解决这一问题的函数countConnectedOnes,函数参数A为给出的01矩阵,A的行数和列数均不大于1000. 函数的返回值是问题的答案.
例1:
A=
100
010
001
答案为3.
例2:
A=
1101
0101
1110
答案为2.
分析:
根据深度优先遍历,依次判断1的周围的连块情况。
代码:
class Solution {
public:
int countConnectedOnes(vector<vector<char>>& A) {
int counts = 0;
int height = A.size(),width = A[0].size();
if(height <= 0 || width <= 0)
return 0;
//判断是否遍历过,未遍历为0,否则为1
vector<vector<int>> isCount;vector<int> temp;
for(int j = 0;j < width;j++)
temp.push_back(0);
for(int i = 0; i < height;i++){
isCount.push_back(temp);
}
//依次遍历
for(int i = 0;i < height;i++){for(int j = 0;j < width;j++){
//当前节点为1且未遍历时判断其相邻点的情况
if(A[i][j] == '1' && isCount[i][j] == 0){addCount(i,j,isCount,A);
counts++;
}
}
}
return counts;
}
void addCount(int currentCol,int currentRow,vector<vector<int>> isCount,vector<vector<char>> A){
int height = A.size(),width = A[0].size();
if(currentCol >= height|| currentRow >= width || isCount[currentCol][currentRow] == 1)
return;
isCount[currentCol][currentRow] = 1;
//判断4个相邻点的情况
if(A[currentCol - 1][currentRow] == '1' && isCount[currentCol - 1][currentRow] == 0)addCount(currentCol - 1,currentRow,isCount,A);
if(A[currentCol + 1][currentRow] == '1' && isCount[currentCol + 1][currentRow] == 0)
addCount(currentCol + 1,currentRow,isCount,A);
if(A[currentCol][currentRow - 1] == '1' && isCount[currentCol][currentRow - 1] == 0)
addCount(currentCol,currentRow - 1,isCount,A);
if(A[currentCol][currentRow + 1] == '1' && isCount[currentCol][currentRow + 1] == 0)
addCount(currentCol,currentRow + 1,isCount,A);
}
};