计蒜客-最大蛋糕数

这一天蒜头君生日,他的朋友们一起来给蒜头君买一个大的蛋糕过生日。游戏做完后到了切蛋糕的时刻了,朋友们知道蒜头君喜欢吃蛋糕,便让蒜头君自己给自己切一块最大的。蒜头君看朋友们这么热情也就不客气了。

这块蛋糕是由 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40511966/article/details/86642145