描述
在一个矩形区域内,有些地方有水,有些地方没水。所有相邻的有水的地方会共同组成一个水洼,小蝌蚪想在这块区域中找到一个最大的水洼来安家。
输入
有多组输入数据,每组第一行包含两个正整数n,m(n,m<=100),接下来n行,每行m个字符,“.”表示有水,“#”表示没水。
输出
对于每组输入数据输出一行,包含一个整数,表示最大的水洼的面积。
样例输入1
3 3 ### ### ##. 2 3 #.. ..# 3 3 ##. #.. .##
样例输出1
1 4 3
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n, m, posn; int vis[110][110];//标记走过的点,0表示没走过,1表示走过 char maps[110][110];//存这个区域 int dir[4][2] = { 1,0,-1,0,0,1,0,-1 };//四个方向 void dfs(int i, int j) { if (i<0 || i >= n || j<0 || j >= m)//筛去不合法的路径 return; if (vis[i][j] || maps[i][j] == '#')//如果这个点走过,或者这个点是'#',也不用走了 return; posn++; vis[i][j] = 1;//面积pos已经自加1了,所以该点也就可以标记走过了 for (int k = 0; k<4; k++)//往四个方向走 dfs(i + dir[k][0], j + dir[k][1]); } int main() { while (cin>>n>>m) { int i, j, maxn = 0; memset(vis, 0, sizeof(vis)); for (i = 0; i<n; i++) scanf("%s", maps[i]); for (i = 0; i<n; i++) for (j = 0; j<m; j++) { if (maps[i][j] == '.' && (!vis[i][j]))//如果是水洼'.'并且这个水洼点'.'没有被计算过,则从这个点开始dfs { posn = 0;//posn存的是每块水洼的面积,每块计算的时候需要重置为0 dfs(i, j); maxn = max(maxn, posn); } } cout << maxn << endl; } return 0; }