搜索

TZOJ 7886: 连通块 深搜广搜模板题


发布时间: 2022-11-24 18:03:07    浏览次数:10 次

描述

一个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;
}

 

免责声明 TZOJ 7886: 连通块 深搜广搜模板题,资源类别:文本, 浏览次数:10 次, 文件大小:-- , 由本站蜘蛛搜索收录2022-11-24 06:03:07。此页面由程序自动采集,只作交流和学习使用,本站不储存任何资源文件,如有侵权内容请联系我们举报删除, 感谢您对本站的支持。 原文链接:https://www.cnblogs.com/jyssh/p/16784564.html