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"); } }
相关文章推荐
- 2017百度之星初赛(A) 1006 度度熊的01世界(搜索连通块)
- 百度之星2017初赛A-1006-度度熊的01世界
- 2017"百度之星"程序设计大赛 - 初赛(A)1006 度度熊的01世界(连通块)
- 2017百度之星初赛(A) 度度熊的01世界(BFS/DFS)
- 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
- 2017"百度之星"程序设计大赛 - 初赛(A)1006 度度熊的01世界
- HDU - 6113 度度熊的01世界 (2017"百度之星"程序设计大赛 - 初赛(A)1006)
- 【2017"百度之星"程序设计大赛 - 初赛(A)】度度熊的01世界
- 2017百度之星初赛A 度度熊的01世界
- 百度之星初赛(A)--度度熊的01世界----bfs搜索
- hdu 6113 度度熊的01世界/2017 百度之星
- 百度之星初赛(A)Hdu-6113.度度熊的01世界
- [HDU6113][2017"百度之星"程序设计大赛 - 初赛(A)]度度熊的01世界
- 2017百度之星初赛(B) 1006 小小粉丝度度熊(尺取法)
- HDU6113 度度熊的01世界(深搜DFS,2017"百度之星"程序设计大赛 - 初赛(A))
- HDU6113 度度熊的01世界(深搜DFS,2017"百度之星"程序设计大赛 - 初赛(A))
- 2017百度之星初赛(B)1006小小粉丝度度熊------hdu6119
- 2017百度之星初赛B-1006-小小粉丝度度熊(尺取)
- hdu6113 2017"百度之星"初赛(A)1006度度熊的01世界(搜索)
- 2017百度之星初赛A-1006(HDU-6113)