题目:相当于有一个m行n列的格子矩阵,每个格子要么@要么*,两个格子是连通的当且仅当这两个格子都是@、且一个格子和另一个是水平、垂直或对角线相邻,即一个格子在另一个格子的周围八个格子范围内。最后求连通块的个数。
思路:和书上例题黑白格子一样,只是一个01,一个*@,稍微改一下就可以了。即通过dfs(x,y)递归地深度优先遍历。
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); }
原文地址:http://blog.csdn.net/buxizhizhou530/article/details/38963049