Description
在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏。现在给你岛上的地图有n行,每行有若干列,每个格子中要么是“”,表示大海,要么是“*”,表示河流或山丘,要么是小写字母,表示一户人家的姓氏。
Input
第一行是个数字N,表示下面信息的行数。接下来是N行字符,每行由小写字母和*号组成,有些行的最前面也可能包含若干连续的空格,表示这些区域是大海,每一行最多不超过200个字符。
Output
一个数字,表示家族数。
Sample Input
4
*zlw**pxh
l*zlwk*hx*
w*tyy**yyy
zzl
Sample Output
3
HINT
[数据范围]
10%的数据,n≤1。
30%的数据,n≤10。
100%的数据,n≤100每一行最多不超过200个字符。
DFS搞定系列
#include <iostream>
#include <string>
#define SIZE 1500
using namespace std;
string s;
bool a[SIZE][SIZE];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
void dfs(int x, int y) // 深度优先搜索模板
{
int i;
a[x][y] = false;
for (i = 0; i < 4; i++)
{
if (a[x+dx[i]][y+dy[i]])
{
dfs(x + dx[i], y + dy[i]);
}
}
return;
}
int main(int argc, char** argv)
{
int n, m = 0, i, j, t = 0, l;
cin >> n;
for (i = 0; i <= n; i++)
{
getline(cin, s); // 注意有空格,不能用cin。
l = s.size();
m = max(m, l);
for (j = 0; j < l; j++)
{
if ((s[j] >= 'a') && (s[j] <= 'z'))
{
a[i][j] = true;
}
}
}
for (i = 0; i <= n; i++)
{
for (j = 0; j < m; j++)
{
if (a[i][j])
{
dfs(i, j);
t++;
}
}
}
cout << t << endl;
return 0;
}