bfs
//http://www.cnblogs.com/IMGavin/ #include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> #include <queue> #include <vector> #include <map> #include <stack> #include <set> #include <bitset> #include <algorithm> using namespace std; typedef long long LL; #define gets(A) fgets(A, 1e8, stdin) const int INF = 0x3F3F3F3F, N = 600, MOD = 1003; const double EPS = 1e-6; int n, m, ti; char str[N][N]; int mp[N][N]; struct node{ int x, y; node(int x1, int y1){ x = x1; y = y1; } }; int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; void bfs(int r, int c){ int r1 = r, r2 = r, c1 = c, c2 = c; ti++; queue<node> q; q.push(node(r, c)); mp[r][c] = ti; while(!q.empty()){ node u = q.front(); q.pop(); for(int i = 0; i < 4; i++){ int x = u.x + dir[i][0]; int y = u.y + dir[i][1]; if(x >= 0 && x < n && y >= 0 && y < m){ if(mp[x][y] == 0&& str[x][y] == '1'){ r1 = min(r1, x); r2 = max(r2, x); c1 = min(c1, y); c2 = max(c2, y); mp[x][y] = ti; q.push(node(x, y)); } } } } printf("%d %d ", r2 - r1 + 1, c2 - c1 + 1); for(int i = r1; i <= r2; i++){ for(int j = c1 ; j <= c2; j++){ if(mp[i][j] == ti ){ printf("1"); }else{ printf("0"); } } printf(" "); } } int main(){ while(cin >> n >> m){ ti = 0; for(int i = 0; i < n; i++){ scanf("%s", str[i]); } memset(mp, 0, sizeof(mp)); for(int j = 0; j < m; j++){ for(int i = 0; i < n; i++){ if(mp[i][j] == 0 && str[i][j] == '1'){ bfs(i, j); } } } } return 0; }