您的位置:首页 > 其它

(水题)并查集求连通块hdu1198

2018-04-02 22:13 162 查看
#include <cstdio>

#include <cstring>
using namespace std;
bool grad[11][4] = {{1,1,0,0}, {1,0,0,1}, {0,1,1,0}, {0,0,1,1},//i = 0表示上,顺时针编号;j = 1表示连通

{1,0,1,0}, {0,1,0,1}, {1,1,0,1}, {1,1,1,0},

{0,1,1,1}, {1,0,1,1}, {1,1,1,1}};
char a[55][55];

int fa[55*55];

int pipe[55*55];
int m, n;
int findfa(int x);

void join(int x, int y, bool flag);//1则兼并右边,0则兼并下面
int main()

{

int i, j;

while(~scanf("%d %d", &m, &n), ~m && ~n)

{

getchar();

for(i = 0; i < m * n; ++i) fa[i] = i;

for(i = 0; i < m; ++i) scanf("%s", a[i]);

getchar();

for(i = 0; i < m; ++i)

for(j = 0; j < n; ++j)

pipe[i * n + j] = a[i][j] - 'A';

for(i = 0; i < m; ++i)

for(j = 0; j < n; ++j)

{

if(j < n - 1) join(i * n + j, i * n + j + 1, 1);

if(i < m - 1) join(i * n + j, (i + 1) * n + j, 0);

}

int cnt = 0;

for(i = 0; i < m * n; ++i)

if(fa[i] == i) ++cnt;

printf("%d\n", cnt);

}

return 0;

}
void join(int x, int y, bool flag)

{

int px = pipe[x], py = pipe[y];

int f1 = findfa(x);

int f2 = findfa(y);

if(flag && grad[px][3] && grad[py][1]) fa[f2] = f1;

if(!flag && grad[px][2] && grad[py][0]) fa[f2] = f1;

}
int findfa(int x)

{

return fa[x] == x ? x : fa[x] = findfa(fa[x]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: