1335-连通块

【题目描述】

一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。

【输入】

第一行两个整数n,m(1≤n,m≤100),表示一个n * m的方格图。

接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。

 

【输出】

一行一个整数ans,表示图中有ans个黑色格子连通块。

【输入样例】

3 3
1 1 1
0 1 0
1 0 1

【输出样例】

3

bfs水题

#include <iostream>
#include <queue>
using namespace std;

queue<int> q;
int a[107][107];
int vis[107][107];
int n,m;

void bfs(int i,int j){
    vis[i][j] = 1;
    q.push(i*1000+j);
    while(!q.empty()){
        int x = q.front()/1000;
        int y = q.front()%1000;
        q.pop();
        if(!vis[x-1][y]&&a[x-1][y]){
            q.push((x-1)*1000+y);
            vis[x-1][y] = 1;
        }
        if(!vis[x][y+1]&&a[x][y+1]){
            q.push(x*1000+y+1);
            vis[x][y+1] = 1;
        }
        if(!vis[x+1][y]&&a[x+1][y]){
            q.push((x+1)*1000+y);
            vis[x+1][y] = 1;
        }
        if(!vis[x][y-1]&&a[x][y-1]){
            q.push(x*1000+y-1);
            vis[x][y-1] = 1;
        }
    }
}
int main(){

    int cnt = 0;
    cin >> n >> m;
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            cin >> a[i][j];
        }
    }

    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            if(!vis[i][j]&&a[i][j]){
                bfs(i,j);
                cnt++;
            }
        }
    }
    cout << cnt;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值