题目:相当于有一个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