思路:
DFS。
求分割出多少空间 & 最大连通区域。
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <fstream>
#include <cmath>
#include <cstring>
#include <limits.h>
#define Long long long
#define uint unsigned int
#define N
#define mod 1000000007
#define inf 100000000
#define eps 1e-10
#define For(i,l,r) for(int i=l;i<=r;i++)
#define Dor(i,r,l) for(int i=r;i>=l;i--)
using namespace std;
ifstream in("/Users/urey/data/input.txt");
//_________________________________________________________________________________
int m, n;
int roomNumber, max_area, tmp_area;
int data[50][50], color[50][50];
void dfs(int i, int j) {
color[i][j] = roomNumber;
tmp_area++;
//if go top no wall
if(!(data[i][j] & 2) && (i > 0) && !color[i-1][j]) dfs(i-1, j);
//bottom
if(!(data[i][j] & 8) && (i < m - 1) && !color[i+1][j]) dfs(i+1, j);
//left
if(!(data[i][j] & 1) && (j > 0) && !color[i][j-1]) dfs(i, j-1);
//right
if(!(data[i][j] & 4) && (j < n - 1) && !color[i][j+1]) dfs(i, j+1);
}
int main(int argc, const char * argv[]) {
in>>m>>n;
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
in>>data[i][j];
}
}
memset(color, 0, sizeof(color));
roomNumber = 0;
max_area = 0;
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
if(!color[i][j]) {
++roomNumber;
tmp_area = 0;
dfs(i, j);
max_area = max(max_area, tmp_area);
}
}
}
cout<<roomNumber<<"\n"<<max_area<<endl;
return 0;
}