题目描述:
小X想要学游泳。
这天,小X来到了游泳池,发现游泳池可以用N行M列的格子来表示,每个格子的面积都是1,且格子内水深相同。
由于小X刚刚入门,他只能在水深相同的地方游泳。为此,他把整个游泳池看成若干片区域,如果两个格子相邻(上下左右四个方向)且水深相同,他就认为它们属于同一片区域。
小X想知道最大的一片区域面积是多少,希望你帮帮他。
输入格式:
第一行包含用一个空格隔开的两个整数N,M。(1≤N,M≤100) 接下来N行,每行包含M个 1到9的数字,表示每个格子的水深
输出格式:
第一行包含一个整数,表示最大的一片区域面积。
限制:
空间限制:128MByte 时间限制:1秒
样例:
输入: 3 3 124 224 152
输出: 3
这一题需要用到泛洪搜索,在游泳池中,我们可以想成高低不平的一块木板,从一块地方开始上下左右移动,如果相同就计数,不同就下一个,继续搜。
注意,题目中的范围不能超过,也就是N与M,并且要处理其中的输入格式,sting输入,存在数组中去;开头的这个地点也需要标记,计数这一块的面积,最后来取一个最大值就可以了。
AC代码:
#include<iostream>
using namespace std;
const int N=1e3;
int nums[N][N],dirs[4][2]={{1,0},{0,1},{-1,0},{0,-1}},flag[N][N];
int n,m,cnt=0,mx=0;
void dfs(int x,int y,int ans){
for(int i=0;i<4;i++){
int nx=x+dirs[i][0];
int ny=y+dirs[i][1];
if(nx<1||nx>n||ny<1||ny>m||nums[nx][ny]!=ans||flag[nx][ny]!=0)continue;
cnt++; mx=max(mx,cnt); flag[nx][ny]=1;
dfs(nx,ny,ans);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string str;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>str;
for(int j=1;j<=m;j++){
nums[i][j]=str[j-1]-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!flag[i][j]){
cnt=1;
flag[i][j]=1;
dfs(i,j,nums[i][j]);
}
}
}
cout<<mx;
return 0;
}