数据流小,深搜即可。有些暴力。看其他人的题解用二维转换成一维做的并查集很巧妙,马上去研究一下!!
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <numeric>
#include <string>
#include <limits.h>
#include <map>
using namespace std; int m, n, ans = ;
char Map[][];
bool vis[][];
map<char, string> check; void dfs (int x, int y) { vis[x][y] = ; if (check[Map[x][y]].find("U") != - && check[Map[x - ][y]].find("D") != -) {
if (!vis[x - ][y]) dfs (x - , y);
} if (check[Map[x][y]].find("D") != - && check[Map[x + ][y]].find("U") != -) {
if (!vis[x + ][y]) dfs (x + , y);
} if (check[Map[x][y]].find("L") != - && check[Map[x][y - ]].find("R") != -) {
if (!vis[x][y - ]) dfs (x, y - );
} if (check[Map[x][y]].find("R") != - && check[Map[x][y + ]].find("L") != -) {
if (!vis[x][y + ]) dfs (x, y + );
}
} int main () { check['A'] = "UL"; check['B'] = "UR"; check['C'] = "DL";
check['D'] = "DR"; check['E'] = "UD"; check['F'] = "LR";
check['G'] = "ULR"; check['H'] = "UDL"; check['I'] = "DLR";
check['J'] = "UDR"; check['K'] = "UDLR"; while (~scanf("%d%d", &m, &n)) {
if (m < && n < ) {
break;
}
memset (vis, , sizeof(vis));
memset (Map, , sizeof(Map));
for (int i = ; i < m ; ++ i) {
for (int j = ; j < n; ++ j) {
cin >> Map[i][j];
}
}
ans = ;
for (int i = ; i < m; ++ i) {
for (int j = ; j < n; ++j) {
if (vis[i][j] != ) {
dfs (i, j);
ans ++;
}
}
} cout << ans << endl;
}
return ;
}