計蒜客:最大的蛋糕塊

題目描述:

這一天蒜頭君生日,他的朋友們一起來給蒜頭君買一個大的蛋糕過生日。遊戲做完後到了切蛋糕的時刻了,朋友們知道蒜頭君喜歡喫蛋糕,便讓蒜頭君自己給自己切一塊最大的。蒜頭君看朋友們這麼熱情也就不客氣了。

這塊蛋糕是由 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 的網格,由’#‘和’.'組成。

輸出格式
輸出一個整數,表示蒜頭君可以喫到的蛋糕最大是多少(即對應到網格中的格子數)。
輸入樣例:
5 6
.#…
…#…
…#…#
…###.
.#…
輸出樣例:
5

AC代碼:

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int n,m;
char map[105][105];//存儲座標系 
int vis[105][105];//存儲該點是否被訪問過 
int ans;//最終的結果 
int cnt;
bool in(int x,int y)
{
	return x>=0&&x<n&&y>=0&&y<m;
}
void dfs(int x,int y)
{
	if(!in(x,y)||map[x][y]=='.'||vis[x][y])
		return ;//本次搜索結束 
	cnt++;
	vis[x][y]=1;//標記該座標點被訪問過 
	//分別向四個方向去搜索(右,下,左,上) 
	dfs(x,y+1);
	dfs(x+1,y);
	dfs(x,y-1);
	dfs(x-1,y);
}
int main()
{
	int i,j;
	cin>>n>>m;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			cin>>map[i][j];
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			if(map[i][j]=='#'&&!vis[i][j])
			{
				cnt=0;
				dfs(i,j);//搜索的起始點 
				if(ans<cnt)
					ans=cnt;
			}
				
		}
	}
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章