思路:
一眼就看出来是有关集合的合并,也就是并查集在二维图上的应用。
然而我感觉dfs更直观似的。。。就直接暴力写dfs了。。
ps: 建图的方法的确蠢了点,,,我看看再改改吧。。。
DFS代码:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
struct grid{
int u,d,l,r;
};
grid m[55][55];
bool vis[55][55];
void f(int i,int j){
vis[i][j] = true;
if(m[i][j].u && m[i-1][j].d && vis[i-1][j] == false){
f(i-1,j);
}
if(m[i][j].d && m[i+1][j].u && vis[i+1][j] == false){
f(i+1,j);
}
if(m[i][j].l && m[i][j-1].r && vis[i][j-1] == false){
f(i,j-1);
}
if(m[i][j].r && m[i][j+1].l && vis[i][j+1] == false){
f(i,j+1);
}
}
int main()
{
int mm,n;
while(scanf("%d%d",&mm,&n),n != -1){
memset(m,0,sizeof(m));
memset(vis,false,sizeof(vis));
char temp;
for(int i = 1;i <= mm;i++){
getchar();
for(int j = 1;j <= n;j++){
temp = getchar();
int tt = temp - 'A';
switch(tt){
case 0:m[i][j].l = m[i][j].u = 1;break;
case 1:m[i][j].r = m[i][j].u = 1;break;
case 2:m[i][j].l = m[i][j].d = 1;break;
case 3:m[i][j].r = m[i][j].d = 1;break;
case 4:m[i][j].d = m[i][j].u = 1;break;
case 5:m[i][j].l = m[i][j].r = 1;break;
case 6:m[i][j].l = m[i][j].r = m[i][j].u = 1;break;
case 7:m[i][j].l = m[i][j].u = m[i][j].d = 1;break;
case 8:m[i][j].l = m[i][j].r = m[i][j].d = 1;break;
case 9:m[i][j].r = m[i][j].u = m[i][j].d = 1;break;
case 10:m[i][j].l = m[i][j].u = m[i][j].d = m[i][j].r = 1;break;
}
}
}
int cnt = 0;
for(int i = 1;i <= mm;i++){
for(int j = 1;j <= n;j++){
if(vis[i][j] == false){
cnt++;
f(i,j);
}
}
}
printf("%d\n",cnt);
}
return 0;
}