这一天蒜头君生日,他的朋友们一起来给蒜头君买一个大的蛋糕过生日。游戏做完后到了切蛋糕的时刻了,朋友们知道蒜头君喜欢吃蛋糕,便让蒜头君自己给自己切一块最大的。蒜头君看朋友们这么热情也就不客气了。
这块蛋糕是由 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>
using namespace std;
int n,m;
char map[1001][1001];
int book[1001][1001]={0};
int ans = -1;
int count = 1;
int next1[4][2] = {0,1,1,0,-1,0,0,-1};
void dfs(int x,int y)
{
if(count > ans)
ans = count;
for(int k = 0;k < 4;++k)
{
int xx = x+next1[k][0];
int yy = y+next1[k][1];
if(xx < 0 || yy < 0 || xx >= n || yy >= m) continue;
if(!book[xx][yy] && map[xx][yy] == '#')
{
count++;
book[xx][yy] = 1;
dfs(xx,yy);
}
}
}
int main()
{
cin >> n >> m;
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j)
cin >> map[i][j];
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j)
{
if(!book[i][j] && map[i][j] == '#')
{
count = 1;
book[i][j] = 1;
dfs(i,j);
}
}
cout << ans << endl;
return 0;
}