#include<iostream>
using namespace std;
int m[55][55];
int visited[55][55] = {0};
int maxlen=0;
int totalen=0;
int maxroom=0;
int max(int a, int b)
{
int t;
if (a > b)
t = a;
else
t = b;
return t;
}
void dfs(int x, int y)
{
if (visited[x][y])
return;
visited[x][y] = maxroom;
totalen++;
if ((m[x][y] &1)==0)
dfs(x,y-1);
if ((m[x][y] &2)==0)
dfs(x-1, y);
if ((m[x][y] & 4)==0)
dfs(x, y+1);
if ((m[x][y] & 8)==0)
dfs(x+1, y);
}
int main()
{
int x,y;
cin >> x >> y;
for (int i = 1; i <= x;i++)
for (int j = 1; j <= y; j++)
{
cin >> m[i][j];
}
for (int i = 1; i <= x;i++)
for (int j = 1; j <= y; j++)
{
if (!visited[i][j])
{
maxroom++;
totalen = 0;
dfs(i, j);
maxlen = max(maxlen,totalen);
}
}
cout << maxroom << endl;
cout << maxlen << endl;
return 0;
using namespace std;
int m[55][55];
int visited[55][55] = {0};
int maxlen=0;
int totalen=0;
int maxroom=0;
int max(int a, int b)
{
int t;
if (a > b)
t = a;
else
t = b;
return t;
}
void dfs(int x, int y)
{
if (visited[x][y])
return;
visited[x][y] = maxroom;
totalen++;
if ((m[x][y] &1)==0)
dfs(x,y-1);
if ((m[x][y] &2)==0)
dfs(x-1, y);
if ((m[x][y] & 4)==0)
dfs(x, y+1);
if ((m[x][y] & 8)==0)
dfs(x+1, y);
}
int main()
{
int x,y;
cin >> x >> y;
for (int i = 1; i <= x;i++)
for (int j = 1; j <= y; j++)
{
cin >> m[i][j];
}
for (int i = 1; i <= x;i++)
for (int j = 1; j <= y; j++)
{
if (!visited[i][j])
{
maxroom++;
totalen = 0;
dfs(i, j);
maxlen = max(maxlen,totalen);
}
}
cout << maxroom << endl;
cout << maxlen << endl;
return 0;
}
ps:这道题边的信息存在了二维数组m[55][55]里边,遍历整个图,寻找最大连通子图(maxroom)