农场主约翰的农场在最近的一场风暴中被洪水淹没,这一事实只因他的奶牛极度害怕水的消息而恶化。 然而,他的保险公司只会根据他农场最大的“湖”的大小来偿还他一笔钱。 农场表示为一个矩形网格,有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 题解:不得不说自己太蠢了,今天下午这题居然没想出来,放这当个教训吧 代码如下:
#include<bits/stdc++.h> using namespace std; int mp[110][110]; int n,m,k; int dfs(int i,int j) { if(i<=0||j<=0||i>n||j>m||mp[i][j]==0) return 0; else { mp[i][j]=0; return 1+dfs(i-1,j)+dfs(i,j-1)+dfs(i+1,j)+dfs(i,j+1); } } int main() { memset(mp,0,sizeof(mp)); scanf("%d%d%d",&n,&m,&k); int x,y; while(k--) { scanf("%d%d",&x,&y); mp[x][y]=1; } int sum=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mp[i][j]==1) { sum=max(dfs(i,j),sum); //找最大“湖” } } } printf("%d\n",sum); return 0; }太菜了