1003. 相连的1

对于一个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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值