中南林业科技大学第十一届程序设计大赛 D 最大的湖
链接:https://ac.nowcoder.com/acm/contest/910/D
来源:牛客网
农场主约翰的农场在最近的一场风暴中被洪水淹没,这一事实只因他的奶牛极度害怕水的消息而恶化。
然而,他的保险公司只会根据他农场最大的“湖”的大小来偿还他一笔钱。
农场表示为一个矩形网格,有N(1≤N≤100)行和M(1≤M≤100)列。网格中的每个格子要么是干的,
要么是被淹没的,而恰好有K(1≤K≤N×M)个格子是被淹没的。正如人们所期望的,一个“湖”有一个
中心格子,其他格子通过共享一条边(只有四个方向,对角线不算的意思)与之相连。任何与中央格子共享一条边或与中央格
子相连的格子共享一条边的格子都将成为湖的一部分。
链接:https://ac.nowcoder.com/acm/contest/910/D
来源:牛客网
来源:牛客网
输入描述:
第一行有三个整数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
qwq这个题就很简单啦计算每一片湖区的大小,然后区最大就行
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; const int maxn = 1e2 + 2; bool vis[maxn][maxn];//矩阵存放该格子是否被淹,true是淹了 int sum = 0; int ans = 0; void dfs(int x, int y)//以vis[x][y]为中心找该片淹没区的大小 { if (vis[x][y])//找没被标记过的格子 { vis[x][y] = false;//将就算过的地方标记一下 sum++; dfs(x + 1, y); dfs(x - 1, y); dfs(x, y + 1); dfs(x, y - 1); } return; } int main() { int n, k, m; cin >> n >> m >> k; //初始化矩阵 for (int i = 1; i <= n; i++) for (int j = 1; j < m; j++) vis[i][j] = false; while (k--) { int x, y; cin >> x >> y; vis[x][y] = true; } for (int i = 1; i <= n; i++) for (int j = 1; j < m; j++) { sum = 0; //DFS每个点其实还可以优化一点点的,不过图小没得事 dfs(i, j); ans = max(sum, ans);//取最大面积 } cout << ans << endl; system("Pause"); return 0; }