首页 > 其他分享 >TZOJ 7886: 连通块 深搜广搜模板题

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

时间:2022-10-12 15:14:36浏览次数:55  
标签:格子 tx ty int 搜广 vis TZOJ 105 7886

描述

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

 

标签:格子,tx,ty,int,搜广,vis,TZOJ,105,7886
From: https://www.cnblogs.com/jyssh/p/16784564.html

相关文章

  • TZOJ 7685: 最短路径 (dijstra/输出路径pre)
    描述  给定n个顶点的带权有向图,若从顶点x到顶点y之间存在一条路径,那么这条路径的长度定义为路径上各条边的权值之和。现在请你找出从顶点1到顶点n的一条最短路径。......
  • TZOJ 2777: Hero in Maze 简单版/深搜DFS
    描述 500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他......
  • TZOJ 6948: 走迷宫/深搜模板
    描述 有一个迷宫,图案如图5.2.6所示,红色区域表示不能通行,蓝色区域表示能通行,在迷宫中通行的方向是上下左右四个方向。从入口(1,1)位置进入迷宫,编程判断能否从出口位置......
  • TZOJ 2674: 一个人的旅行 最短路/Floyd
    描述虽然草儿是个路痴(就是在tzc待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看......
  • TZOJ 7509求1e8以内的素数个数 埃氏筛/欧拉筛
    描述  给定一个正整数N,求出1到N中有多少个素数。  输入  输入一行一个正整数N。对于30%的数据,N<=100对于70%的数据,N<=5000对于100%的数据,N<=10000......