#include <iostream> #include <vector> #include <set> #include <queue> #include <algorithm> #include <string> #include <fstream> #include <cctype> #include <iomanip> #include <cmath> #include <cstring> #include <map> #include <bitset> #include <stack> /* //c++11 #include <unordered_map> #include <unordered_set> #include <tuple> */ using namespace std; //ifstream fin("1.in"); //ofstream fout("1.out"); bool used[1027][1027]; bool isC[1027][1027]; bool a[1027][1027]; pair<int, int> A,B,C,D; const int di[24] = {0,0,1,-1,1,1,-1,-1,2,2,2,2,2,-2,-2,-2,-2,-2,-1,-1,0,0,1,1}; const int dj[24] = {1,-1,0,0,1,-1,1,-1,-2,-1,0,1,2,-2,-1,0,1,2,2,-2,2,-2,2,-2}; void afis(pair<int, int> x) { cout<<x.first<<' '<<x.second<<'\n'; } queue<pair<int, int> > Q; int colt; void fa(int i, int j) { int Fmarg = 0; for(int k = 0; k < 24; k++) { int inou = i + di[k]; int jnou = j + dj[k]; if(inou < 0 || jnou < 0) continue; if(!a[inou][jnou]) { Fmarg ++; } if(isC[inou][jnou]) { //isC[i][j] = true; return; } } if(Fmarg > 12) { colt++; isC[i][j] = true; // cout<<i<<' '<<j<<'\n'; } } void dute(int i, int j) { Q.push(make_pair(i,j)); used[i][j] = true; while(!Q.empty()) { i = Q.front().first; j = Q.front().second; Q.pop(); fa(i,j); for(int k = 0; k < 8; k++) { int inou = i + di[k]; int jnou = j + dj[k]; if(!used[inou][jnou] && a[inou][jnou]) { used[inou][jnou] = true; Q.push(make_pair(inou, jnou)); } } } } int main() { //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); int n, m; cin>>n>>m; char c; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { cin>>c; a[i][j] = c == '1'; } int linie = 0, triunghi = 0, patrat = 0, pentagon = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(a[i][j] && !used[i][j]) { colt = 0; dute(i,j); if(colt == 3) triunghi ++; else if(colt == 4) patrat ++; else if(colt == 5) pentagon++; else linie++; //cout<<colt; //cout<<"da\n"; } cout<<2<<' '<<linie<<'\n'; cout<<3<<' '<<triunghi<<'\n'; cout<<4<<' '<<patrat<<'\n'; cout<<5<<' '<<pentagon<<'\n'; return 0; } //FILE!!!