12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #include <algorithm>
- #include <cstdio>
- using namespace std;
- const int L = 50;
- int m, n;
- struct Grid {
- bool u;
- bool d;
- bool l;
- bool r;
- bool v;
- void set(int i) {
- this->l = (i & 1) != 0;
- this->u = (i & 2) != 0;
- this->r = (i & 4) != 0;
- this->d = (i & 8) != 0;
- this->v = false;
- }
- };
- Grid map[L][L];
- int dfs(int x, int y) {
- int cnt = 1;
- map[x][y].v = true;
- if (!map[x][y].l && !map[x][y - 1].v) cnt += dfs(x, y - 1);
- if (!map[x][y].r && !map[x][y + 1].v) cnt += dfs(x, y + 1);
- if (!map[x][y].u && !map[x - 1][y].v) cnt += dfs(x - 1, y);
- if (!map[x][y].d && !map[x + 1][y].v) cnt += dfs(x + 1, y);
- return cnt;
- }
- int main() {
- scanf("%d %d", &m, &n);
- for (int i = 0, g; i < m; i++) {
- for (int j = 0; j < n; j++) {
- scanf("%d", &g);
- map[i][j].set(g);
- }
- }
- int num = 0, size = 0;
- for (int i = 0; i < m; i++) {
- for (int j = 0; j < n; j++) {
- if (map[i][j].v) continue;
- num++;
- size = max(size, dfs(i, j));
- }
- }
- printf("%d\n%d\n", num, size);
- return 0;
- }
|