您的位置:首页 > 其它

2017百度之星初赛(A) 1006 度度熊的01世界(bfs找连通块)

2017-08-12 19:28 429 查看

题目大意:

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

代码实现:

首先对于给定的一个地图,找到一个 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");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息