小蝌蚪安家
发布时间: 2017年6月13日 14:20 最后更新: 2017年6月13日 14:23 时间限制: 1000ms 内存限制: 128M
在一个矩形区域内,有些地方有水,有些地方没水。所有相邻的有水的地方会共同组成一个水洼,小蝌蚪想在这块区域中找到一个最大的水洼来安家。
有多组输入数据,每组第一行包含两个正整数n,m(n,m<=100),接下来n行,每行m个字符,“.”表示有水,“#”表示没水。
对于每组输入数据输出一行,包含一个整数,表示最大的水洼的面积。
复制
3 3 ### ### ##. 2 3 #.. ..# 3 3 ##. #.. .##
1 4 3
基础题,bfs或者dfs。为练习,使用dfs。
解决方法:一种是floodfill,一种是一般的dfs。
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 100+5;
int m,n,area,maxlen;
char map[maxn][maxn];
int vis[maxn][maxn];
int num[100];
void dfs(int r,int c,int idx)
{
if(r<0||r>=m||c<0||c>=n)return;//防出界
if(vis[r][c]||map[r][c]!='.')return;
vis[r][c] = idx;
for(int dr = -1;dr<=1;dr++)
for(int dc = -1;dc<=1;dc++)
if(dr!=0||dc!=0)//不同时为零
// dfs(r+1,c,idx);
// dfs(r-1,c,idx);
// dfs(r,c+1,idx);
// dfs(r,c-1,idx);
//
num[idx]++;
}
int main()
{
while(cin>>m>>n)
{
maxlen = -1;
for(int i = 0;i<m;i++)scanf("%s",&map[i]);
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
int cnt= 0;
for(int i = 0 ;i < m;i++)
for(int j = 0; j < n;j++)
if(!vis[i][j]&&map[i][j]=='.')dfs(i,j,++cnt);
cout<<cnt<<endl;
for(int i =0 ;i < 100;i++)
{
maxlen = max(maxlen,num[i]);
}
cout<<maxlen<<endl;
}
}
#include<iostream>
#include<string.h>
using namespace std;
#define M 110
int n,m,maxA,tmpA;
char map[M][M];
int vis[M][M];
int to[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int sx,int sy)
{
if(vis[sx][sy]||map[sx][sy]!='.')
return ;
if(sx<0||sx>=n||sy<0||sy>=m)
return ;
vis[sx][sy] = 1;
tmpA++;
for(int i = 0 ;i < 4;i++)
{
dfs(sx+to[i][0],sy+to[i][1]);
}
}
int main()
{
freopen("kedou.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
for(int i = 0 ; i < n;i++)
scanf("%s",&map[i]);
maxA = 0;
tmpA = 0;
for(int i = 0;i<n;i++)
for(int j =0;j<m;j++)
{
if(map[i][j]=='.'&&vis[i][j]!=1)
{
dfs(i,j);
maxA = max(maxA,tmpA)
tmpA = 0;
}
}
cout<<maxA<<endl;
}
}