图论入门题,找多少个八连块,简单的dfs解决
//给出一个m*n的矩阵,有些方格染色,一个方格的邻接方格有8个,就是它四周的八个 //一个染色的方格的邻接方格中也有染色的话那么把他们看做是一起的,都归为一个八连块 //题目要找这个矩阵中有多少个八连块 #include <stdio.h> #include <string.h> #define N 110 #define M 110 bool a[M][N],vis[M][N]; int m,n; void dfs(int i , int j) { if(!a[i][j] || vis[i][j]) return ; vis[i][j]=1; dfs(i-1,j-1); dfs(i-1,j); dfs(i-1,j+1); dfs(i,j-1); dfs(i,j+1); dfs(i+1,j-1); dfs(i+1,j); dfs(i+1,j+1); return ; } int main() { int i,j,count; char s[M]; while(1) { scanf("%d%d",&m,&n); if(!m) break; memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); for(i=1; i<=m; i++) { scanf("%s",s+1); for(j=1; j<=strlen(s+1); j++) if(s[j]=='@') a[i][j]=1; } for(j=0; j<=n+1; j++) vis[0][j]=vis[m+1][j]=1; for(i=0; i<=m+1; i++) vis[i][0]=vis[i][n+1]=1; /* printf("打印a矩阵\n"); for(i=1; i<=m; i++) { for(j=1; j<=n; j++) printf("%d",a[i][j]); printf("\n"); } printf("打印vis矩阵\n"); for(i=0; i<=m+1; i++) { for(j=0; j<=n+1; j++) printf("%d",vis[i][j]); printf("\n"); } */ for(count=0,i=1; i<=m; i++) for(j=1; j<=n; j++) if(a[i][j] && !vis[i][j]) { count++; dfs(i,j); } printf("%d\n",count); } return 0; }