列表

详情


NC25994. 最大的湖

描述

农场主约翰的农场在最近的一场风暴中被洪水淹没,这一事实只因他的奶牛极度害怕水的消息而恶化。

然而,他的保险公司只会根据他农场最大的“湖”的大小来偿还他一笔钱。


农场表示为一个矩形网格,有N(1≤N≤100)行和M(1≤M≤100)列。网格中的每个格子要么是干的,

要么是被淹没的,而恰好有K(1≤K≤N×M)个格子是被淹没的。正如人们所期望的,一个“湖”有一个

中心格子,其他格子通过共享一条边(只有四个方向,对角线不算的意思)与之相连。任何与中央格子共享一条边或与中央格

子相连的格子共享一条边的格子都将成为湖的一部分。

输入描述

第一行有三个整数N,M,K,分别表示这个矩形网格有N行,M列,K个被淹没的格子。

接下来K行,每一行有两个整数R,C。表示被淹没的格子在第R行,第C列。

输出描述

输出最大的“湖”所包含的格子数目

示例1

输入:

3 4 5
3 2
2 2
3 1
2 3
1 1

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 10ms, 内存消耗: 604K, 提交时间: 2019-06-06 23:06:44

#include<iostream> 
using namespace std;
int cnt,n,m,k,b[105][105];
void dfs(int x,int y){
	if(!b[x][y])
		return;
	b[x][y]=0;
	cnt++;
	if(y+1<=m) dfs(x,y+1);
	if(y>1) dfs(x,y-1);
	if(x+1<=n) dfs(x+1,y);
	if(x>1) dfs(x-1,y);
}
int main(){
	int ans=-1;
	pair<int,int> p[10005];
	cin>>n>>m>>k;
	for(int i=0;i<k;i++){
		cin>>p[i].first>>p[i].second;
		b[p[i].first][p[i].second]=1;
	}
	for(int i=0;i<k;i++){
		if(b[p[i].first][p[i].second]){
			cnt=0;
			dfs(p[i].first,p[i].second);
			if(ans<cnt)
				ans=cnt;
		}
	}
	cout<<ans<<endl;
	return 0;
}

Python3 解法, 执行用时: 77ms, 内存消耗: 5676K, 提交时间: 2022-03-05 16:46:44

m, n, k = map(int, input().split())

seen = set()
grid = [[0 for i in range(n)] for j in range(m)]
def dfs(r, c):
    if not (0 <= r < m and 0 <= c < n and grid[r][c] == 1 and (r, c) not in seen):
        return 0
    seen.add((r, c))
    return 1 + dfs(r-1, c) + dfs(r+1, c) + dfs(r, c-1) + dfs(r, c+1)

for _ in range(k):
    R, C = map(int, input().split())
    grid[R-1][C-1] = 1

ans = 0
for r in range(m):
    for c in range(n):
        if grid[r][c] == 1:
            ans = max(ans, dfs(r, c))
print(ans)

C++ 解法, 执行用时: 9ms, 内存消耗: 448K, 提交时间: 2022-03-20 01:07:12

#include <bits/stdc++.h>
using namespace std;

bool used[110][110];
int ans = 0;

void dfs(int x, int y){
	if(used[x][y]){
		used[x][y] = false;
		ans++;
		dfs(x+1, y);
		dfs(x-1, y);
		dfs(x, y+1);
		dfs(x, y-1);
	}
}

int main(){
	int n, m, k; cin >> n >> m >> k;
	while(k--){
		int x, y; cin >> x >> y;
		used[x][y] = true;
	}
	int maxn = 0;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++){
			ans = 0;
			dfs(i, j);
			maxn = max(ans, maxn);
		}
	cout << maxn;
	return 0;
}

上一题