题目描述
小K在玩动物森友会,作为一个钓鱼爱好者,他想获得钓鱼比赛的冠军!在他面前是一片湖面,湖面以大小为
n x m
的二进制矩阵 grid
进行表示。grid
中0
表示湖水,1
表示该位置有 1 条鱼。
恰好,他有一把神奇的鱼竿,这把鱼竿可以在任意位置开始抛竿,并且一次性钓到与该位置连通的整个鱼群,这里的「连通」要求鱼群中的 鱼 必须在 水平或者竖直的四个方向上 相邻。
他想问问你,在单次垂钓中,最多能钓到的鱼的数量。如果图上没有任何鱼,请输出0.
输入格式
第一行有两个正整数 n和 m(1≤n,m≤1000),代表该湖面是一个 n x m 的矩阵。
后面的 n 行每行有 m 个整数,每个数字为 0 或1,1 代表这里有1条鱼,0 代表是湖水。
输出格式
一个正整数,表示单次垂钓中能获得的最多的鱼的数目。
输入样例#1
8 13
0 0 1 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0 0
0 1 0 0 1 1 0 0 1 0 1 0 0
0 1 0 0 1 1 0 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
输出样例#1
6
输入样例#2
7 12
0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0 0 0
0 1 1 1 0 0 1 1 1 0 0 0
0 0 0 0 0 1 1 1 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0
输出样例#2
9
样例解释
对于样例一
答案不应该是11,因为 橙色鱼群 与 下方的黄色鱼群 不连通,并不属于一个鱼群
题解:dfs遍历,当前位置为1是,开始遍历,分别向四个方向遍历,如果为1,ans++,进一步遍历。
#include<iostream>
using namespace std;
const int N = 1005;
int dx[] = { 0,1,-1,0 };
int dy[] = { 1,0,0,-1 };
int sp[N][N];
bool vis[N][N];
int ans = 0,mans=0,fans=0;
int n, m;
void dfs(int x, int y)
{
vis[x][y] = true;
for (int i = 0; i < 4; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if (tx < n && tx >= 0 && ty < m && ty >= 0)
{
if (sp[tx][ty] == 1&&!vis[tx][ty])
{
//cout << "ans: " << ans << endl;
ans++;
vis[tx][ty] = true;
dfs(tx, ty);
}
}
}
fans = max(fans, ans);
//cout << "fans: " << fans << endl;
return;
}
int main()
{
memset(vis, false, sizeof vis);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
/*char c;
cin >> c;*/
cin>>sp[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (!vis[i][j] && sp[i][j] == 1)
{
ans = 1;
dfs(i, j);
}
}
}
cout << fans << endl;
}