描述

一个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
一下子没理解题目意思,翻了翻一本通才发现原来只是问有地图里有多少个上下左右的连通块区域
dfs深搜代码:
#include<bits/stdc++.h>
using namespace std;
int g[105][105];
int vis[105][105];
int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int n,m,ans;
void dfs(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int tx = nex[i][0]+x;
        int ty = nex[i][1]+y;
        if(tx<1||tx>n||ty<1||ty>m)continue;
        if(g[tx][ty]==1&&vis[tx][ty]==0)
        {
            vis[tx][ty] = 1;
            dfs(tx,ty);
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>g[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]==1&&vis[i][j]==0)
            {
                vis[i][j] = 1;
                ans++;
                dfs(i,j);
            }
        }
    cout<<ans;
     return 0;
}

 

BFS广搜代码

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
};
int g[105][105];
int vis[105][105];
int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int n,m,ans;
node q[10005];
void bfs(int sx,int sy)
{
    int head=1,tail=1;
    q[tail].x = sx;
    q[tail].y = sy;
    vis[sx][sy] = 1;
    tail++;
    while(head<tail)
    {
        for(int i=0;i<4;i++)
        {
            int tx = nex[i][0]+q[head].x;
            int ty = nex[i][1]+q[head].y;
            if(tx<1||tx>n||ty<1||ty>m)continue;
            if(g[tx][ty]==1&&vis[tx][ty]==0)
            {
                vis[tx][ty] = 1;
                q[tail].x = tx;
                q[tail].y = ty;
                tail++;
            }
        }
        head++;
    }
    
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>g[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]==1&&vis[i][j]==0)
            {
                ans++;
                bfs(i,j);
            }
        }
    cout<<ans;
     return 0;
}

 

原文地址:http://www.cnblogs.com/jyssh/p/16784564.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性