题目大意:

大概就是找给定地图中的连通块个数相关的,代码打的还是慢。

代码实现:

首先对于给定的一个地图,找到一个 1 的点,然后一个 bfs 下去,把走过的 1 点都标记下。走完之后,再查一遍,如果有没被标记的,就说明 1 点的连通块不止一个了。
之后再继续找 0 的连通块,同时记录下在 bfs 过程中不能接触到地图边缘的连通块个数,最后判断一下就可以了。

代码:

#include<bits/stdc++.h>
using namespace std;

bool x_map[105][105];
bool vis[105][105];
int n,m;
char temp_c;
struct point
{
    int x;int y;
};


void bfs(int x,int y)
{
    queue<point>q;
    vis[x][y]=1;
    point t;
    t.x=x;t.y=y;
    q.push(t);
    while(!q.empty())
    {
        t=q.front();
        if(t.y>0&&vis[t.x][t.y-1]==0&&x_map[t.x][t.y-1]==1)
        {
            vis[t.x][t.y-1]=1;
            point tt;tt.x=t.x;tt.y=t.y-1;
            q.push(tt);
        }
        if(t.y<m-1&&vis[t.x][t.y+1]==0&&x_map[t.x][t.y+1]==1)
        {
            vis[t.x][t.y+1]=1;
            point tt;tt.x=t.x;tt.y=t.y+1;
            q.push(tt);
        }
        if(t.x>0&&vis[t.x-1][t.y]==0&&x_map[t.x-1][t.y]==1)
        {
            vis[t.x-1][t.y]=1;
            point tt;tt.x=t.x-1;tt.y=t.y;
            q.push(tt);
        }
        if(t.x<n-1&&vis[t.x+1][t.y]==0&&x_map[t.x+1][t.y]==1)
        {
            vis[t.x+1][t.y]=1;
            point tt;tt.x=t.x+1;tt.y=t.y;
            q.push(tt);
        }
        q.pop();
    }
}

bool find_edge(int x,int y)
{
    int is_edge=0;
    queue<point>q;
    vis[x][y]=1;
    point t;
    t.x=x;t.y=y;
    q.push(t);
    while(!q.empty())
    {
        t=q.front();
        if(t.y==0||t.x==0||t.y==(m-1)||t.x==(n-1))is_edge=1;
        if(t.y>0&&vis[t.x][t.y-1]==0&&x_map[t.x][t.y-1]==0)
        {
            vis[t.x][t.y-1]=1;
            point tt;tt.x=t.x;tt.y=t.y-1;
            q.push(tt);
        }
        if(t.y<m-1&&vis[t.x][t.y+1]==0&&x_map[t.x][t.y+1]==0)
        {
            vis[t.x][t.y+1]=1;
            point tt;tt.x=t.x;tt.y=t.y+1;
            q.push(tt);
        }
        if(t.x>0&&vis[t.x-1][t.y]==0&&x_map[t.x-1][t.y]==0)
        {
            vis[t.x-1][t.y]=1;
            point tt;tt.x=t.x-1;tt.y=t.y;
            q.push(tt);
        }
        if(t.x<n-1&&vis[t.x+1][t.y]==0&&x_map[t.x+1][t.y]==0)
        {
            vis[t.x+1][t.y]=1;
            point tt;tt.x=t.x+1;tt.y=t.y;
            q.push(tt);
        }
        q.pop();
    }
    return is_edge;
}

int main()
{

    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        scanf("%c",&temp_c);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            scanf("%c",&temp_c);
            x_map[i][j]=(temp_c-'0');
        }
    }
    int flag=0;//标记是否
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(x_map[i][j]==1)
            {
                bfs(i,j);
                flag=1;
                break;
            }
        }
        if(flag==1)break;
    }
    if(flag==1)
    {
       for(int i=0;i<n;i++)
       {
           for(int j=0;j<m;j++)
           {
               if(x_map[i][j]==1&&vis[i][j]==0)flag=0;
           }
       }
    }
    if(flag==0)
    {
        printf("-1\n");
        continue;
    }
    int flag0=0;

    for(int i=0;i<n;i++)
    {

        for(int j=0;j<m;j++)
        {
            if(x_map[i][j]==0&&vis[i][j]==0)
            {
                if(find_edge(i,j)==0)flag0++;
            }
        }
    }
    if(flag0==1)printf("0\n");
    else if(flag0==0)printf("1\n");
    else printf("-1\n");
    }

}