这一天蒜头君生日,他的朋友们一起来给蒜头君买一个大的蛋糕过生日。游戏做完后到了切蛋糕的时刻了,朋友们知道蒜头君喜欢吃蛋糕,便让蒜头君自己给自己切一块最大的。蒜头君看朋友们这么热情也就不客气了。
这块蛋糕是由 R \times CR×C 的网格构成,每个网格上面都放有不同的水果。蒜头君把这些水果分为两类,一类是自己喜欢吃的水果,用'#'
来表示;一类是自己不喜欢吃的水果,用'.'
来表示。
蒜头君对切出的蛋糕有如下要求:
- 切出的蛋糕连成一块(可以不为矩形,但必须在网格上连通)
- 切出的蛋糕只包含自己喜欢吃的水果
请问,蒜头君最大可以吃到多大的蛋糕?
输入格式
第一行输入两个被空格隔开的整数 R(1 \le R \le 1000)R(1≤R≤1000) 和 C(1 \le C \le 1000)C(1≤C≤1000)。
然后会有一个 R \times CR×C 的网格,由'#'
和'.'
组成。
输出格式
输出一个整数,表示蒜头君可以吃到的蛋糕最大是多少(即对应到网格中的格子数)。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string cake[1010];
int m,n;
int catc= 0;
bool vis[1010][1010];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int cnt;
bool in(int x,int y){
return (x>=0 && x<n && y>=0 && y<m);
}
int dfs(int x,int y){
vis[x][y] = true;
cnt++;
if(cnt > catc){
catc= cnt;
}
for(int i=0;i<4;i++){
int tx = x+dir[i][0];
int ty = y+dir[i][1];
if(in(tx,ty) && vis[tx][ty] != true && cake[ty][tx] != '.'){
dfs(tx,ty);
}
}
}
struct node{
int x;
int y;
};
int main(){
vector<node> v;
cin >> m >> n;
for(int i=0;i<m;i++){
cin >> cake[i];
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(cake[i][j] == '#' && vis[i][j] != true){
v.push_back((node){j,i});
}
}
}
for(int i=0;i<v.size();i++){
dfs(v[i].x,v[i].y);
cnt = 0;
}
cout <<catc<<endl;;
return 0;
}