UVa 572 油田
2014-08-31 20:49
357 查看
题目:相当于有一个m行n列的格子矩阵,每个格子要么@要么*,两个格子是连通的当且仅当这两个格子都是@、且一个格子和另一个是水平、垂直或对角线相邻,即一个格子在另一个格子的周围八个格子范围内。最后求连通块的个数。
思路:和书上例题黑白格子一样,只是一个01,一个*@,稍微改一下就可以了。即通过dfs(x,y)递归地深度优先遍历。
这里有个技巧是,在将mat从1而不是0开始,即在mat的外围四周加一圈0,这样就不用判断坐标是否出界了。(外围加一圈停止字符,避免判断坐标是否出界)
Code:
思路:和书上例题黑白格子一样,只是一个01,一个*@,稍微改一下就可以了。即通过dfs(x,y)递归地深度优先遍历。
这里有个技巧是,在将mat从1而不是0开始,即在mat的外围四周加一圈0,这样就不用判断坐标是否出界了。(外围加一圈停止字符,避免判断坐标是否出界)
Code:
#include<stdio.h> #include<string.h> #define MAX 110 void dfs(int x,int y); char mat[MAX][MAX]; int vis[MAX][MAX]; int m,n; int main() { while(scanf("%d%d",&m,&n)==2 && m) { memset(mat,'*',sizeof(mat)); memset(vis,0,sizeof(vis)); char s[MAX]; for(int i=0;i<m;++i) { scanf("%s",s); for(int j=0;j<n;++j) mat[i+1][j+1]=s[j]; } int cnt=0; for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) if(mat[i][j]=='@' && !vis[i][j]) { dfs(i,j); cnt++; } printf("%d\n",cnt); } return 0; } void dfs(int x,int y) { if(mat[x][y]=='*' || vis[x][y]) return ; vis[x][y]=1; dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1); dfs(x,y-1); dfs(x,y+1); dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); }
相关文章推荐
- UVa-572油田
- 例题 6-12 油田 UVa 572 用dfs求连通块
- 油田(Oil Deposits, UVa 572)
- 油田 (Oil Deposits,Uva 572)
- uva 572 油田
- uva 572 Oil Deposits(油田)—— DFS
- UVa 572 - Oil Deposits(油田 dfs) 错的离谱的我
- 油田(Oil Deposits, UVa 572)
- UVA572(油田)简单的深搜问题
- UVA-6.4.1-油田-572-DFS
- 油田(Oil Deposits,UVa 572)
- [UVa]572 油田 Oil Deposits
- 算法竞赛入门经典 例题 6-12 油田(Oil Deposits, UVa 572)
- Uva 572 Oil Deposits 油田 (DFS求连通块)
- 油田问题 UVA 572
- uva572 油田 连通块遍历
- 油田(UVA572)
- 油田问题 UVA 572
- 油田UVA 572
- Uva572-油田