标签:
把相连的格子放入同一个集合,统计集合的个数即可
#include<stdio.h> const int MAXN = 40000; /*结点数目上限*/ int pa[MAXN]; /*p[x]表示x的父节点*/ int rank[MAXN]; /*rank[x]是x的高度的一个上界*/ int find(int x) { /*带路径压缩的查找*/ if(x != pa[x]) pa[x] = find(pa[x]); return pa[x]; } /*按秩合并x,y所在的集合*/ void union_set(int x, int y) { x = find(x); y = find(y); if(rank[x] > rank[y])/*让rank比较高的作为父结点*/ pa[y] = x; else { pa[x] = y; if(rank[x] == rank[y]) rank[y]++; } } int n, m; int cell[200][200]; #define P(i,j) (i * m + j) int main() { int i, j, sum = 0; scanf("%d%d", &n, &m); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) { scanf("%1d", &cell[i][j]); if(cell[i][j]) { pa[P(i, j)] = P(i, j); if(cell[i - 1][j]) union_set(P(i, j), P(i - 1, j)); if(cell[i][j - 1]) union_set(P(i, j), P(i, j - 1)); } } for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { if(cell[i][j]) { if(P(i, j) == find(P(i, j))) sum++; } } } printf("%d\n", sum); return 0; } /* 4 10 0234500067 1034560500 2045600671 0000000089 */
标签:
原文地址:http://www.cnblogs.com/4bytes/p/5579320.html