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; }