TZOJ 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; }