//一下代码来自中国大学mooc中程序设计与算法(二)算法基础 郭炜
#include "iostream"
#include "stack"
#include "cstring"
using namespace std;
int R,C;//地图的行数和列数
int maps[50][50];//存放地图
int colors[50][50];//存放地图标志,对于不同的一条路径赋值为非0的一个数
int roomnum = 0;
int roomarea = 0;//当前面积
int maxrommarea = 0;//最大面积
void dfs (int i, int j)//从第i,j个节点开始遍历图
{
if(colors[i][j])
return ;//旧点,直接返回
else
{
roomarea++;
colors[i][j] = roomnum;
if( (maps[i][j] & 1) == 0) dfs(i, j-1);//向西走
if( (maps[i][j] & 2) == 0) dfs(i-1, j);//向北
if( (maps[i][j] & 4) == 0) dfs(i, j+1);//向东
if( (maps[i][j] & 8) == 0) dfs(i+1, j);//向南
}
}
int main()
{
cin>>R>>C;
for(int i=0;i<R;i++)
for(int j=0; j<C;j++)
cin>>maps[i][j];
//以上为读入数据
memset(colors, 0, sizeof(colors));//colors数组初始化
for(int i=0;i<R;i++)
for(int j=0; j<C;j++)
{
if(colors[i][j] == 0)//对所有的新点,采用dfs遍历
{
roomnum++;
roomarea = 0;
dfs(i, j);
}
maxrommarea = max(roomarea, maxrommarea);
}
cout<<roomnum<<endl;
cout<<maxrommarea;
return 0;
}