问题 F: 雄伟的城堡
时间限制: 3 Sec 内存限制: 128 MB
题目描述
在一个群岛上,有一个富可敌国的大富翁。他打算在这个群岛上建造一个最大城堡,也就是群岛上最大的岛屿。
输入
第一行是一个整数T,代表测试数据的组数。每组数据中第一行是两个整数n,m,代表地图的大小。接下来n行每行共m个整数。0代表海洋,1代表陆地。其中T<=50,n,m<=200
输出
共T行,最大的面积。
样例输入
1
5 5
0 1 1 0 0
1 1 0 0 0
0 0 1 1 0
0 1 1 1 1
0 0 1 1 0
样例输出
8
dfs求最大连通子块
#include<bits/stdc++.h>
using namespace std;
int mymap[210][210],vis[210][210],ans,sum;
int move[][2]={{1,0},{-1,0},{0,1},{0,-1}};
int t,n,m;
void dfs(int x,int y)
{
if(mymap[x][y]==1) sum++;
else return;
// vis[x][y]=1;
for(int i=0;i<4;i++)
{
int dx=x+move[i][0];
int dy=y+move[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy])
{
vis[dx][dy]=1;
dfs(dx,dy);
}
}
}
int main()
{
scanf("%d",&t);
for(int i=0;i<t;i++)
{
scanf("%d%d",&n,&m);
for(int j=0;j<n;j++)
{
for(int k=0;k<m;k++)
{
scanf("%d",&mymap[j][k]);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mymap[i][j]==1)
{
sum=0;
vis[i][j]=1;
dfs(i,j);
if(ans<sum) ans=sum;
}
}
}
printf("%d\n",ans);
}
return 0;
}