#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<std::string> lines;
for(;;)
{
std::string line;
std::cin >> line;
lines.push_back(std::move(line));
if(std::cin.eof()) break;
}
int width = lines[0].size();
int height = lines.size();
std::vector<std::vector<char>> input(width, std::vector<char>(height));
for(int y = 0; y < height; ++y)
{
for(int x = 0; x < width; ++x)
{
input[x][y] = lines[y][x];
}
}
std::vector<std::vector<int>> possibilities(width, std::vector<int>(height, 0));
for(int y = 0; y < height - 1; ++y) //filling where 2x2 square fits
{
for(int x = 0; x < width - 1; ++x)
{
if(input[x][y] == '1' && input[x + 1][y] == '1' && input[x][y + 1] == '1' && input[x + 1][y + 1] == '1')
{
possibilities[x][y] = 1;
}
}
}
for(int y = 0; y < height; ++y) //printing for debug
{
for(int x = 0; x < width; ++x)
{
std::cout << possibilities[x][y] << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
for(int y = 0; y < height; ++y) //counting neighbours
{
for(int x = 0; x < width; ++x)
{
if(possibilities[x][y] == 0) continue;
int minX = -1;
int minY = -1;
int maxX = 1;
int maxY = 1;
if(x <= 0) minX = 0;
if(y <= 0) minY = 0;
if(x >= width - 1) maxX = 0;
if(y >= height - 1) maxY = 0;
for(int xx = minX; xx <= maxX; ++xx)
{
for(int yy = minY; yy <= maxY; ++yy)
{
if(xx == 0 && yy == 0) continue;
if(possibilities[xx + x][yy + y] > 0) ++possibilities[x][y];
}
}
}
}
for(int y = 0; y < height; ++y) //printing for debug
{
for(int x = 0; x < width; ++x)
{
std::cout << possibilities[x][y] << ' ';
}
std::cout << '\n';
}
std::cout << '\n';
struct Element
{
int value;
int x;
int y;
};
std::vector<Element> sortedElements;
for(int y = 0; y < height; ++y) //printing for debug
{
for(int x = 0; x < width; ++x)
{
if(possibilities[x][y] > 0) sortedElements.push_back(Element {possibilities[x][y], x, y});
}
}
std::sort(sortedElements.begin(), sortedElements.end(), [](const Element & lhs, const Element & rhs) -> bool {return lhs.value < rhs.value;});
/*
for(int y = 0; y < height; ++y) //taking values with lesser neighbours
{
for(int x = 0; x < width; ++x)
{
if(possibilities[x][y] == 0) continue;
int minX = -1;
int minY = -1;
int maxX = 1;
int maxY = 1;
if(x <= 0) minX = 0;
if(y <= 0) minY = 0;
if(x >= width - 1) maxX = 0;
if(y >= height - 1) maxY = 0;
bool inSolution = true;
for(int xx = minX; xx <= maxX; ++xx)
{
for(int yy = minY; yy <= maxY; ++yy)
{
if(xx == 0 && yy == 0) continue;
if(possibilities[xx + x][yy + y] == 0) continue;
if(possibilities[x][y] > possibilities[xx + x][yy + y])
{
inSolution = false;
xx = maxX + 1; //to break out of two loops
break;
}
}
}
if(inSolution)
{
for(int xx = minX; xx <= maxX; ++xx)
{
for(int yy = minY; yy <= maxY; ++yy)
{
if(xx == 0 && yy == 0) continue;
possibilities[xx + x][yy + y] = 0;
}
}
}
}
}
*/
for(auto& element : sortedElements)
{
int x = element.x;
int y = element.y;
if(possibilities[x][y] == 0) continue;
int minX = -1;
int minY = -1;
int maxX = 1;
int maxY = 1;
if(x <= 0) minX = 0;
if(y <= 0) minY = 0;
if(x >= width - 1) maxX = 0;
if(y >= height - 1) maxY = 0;
bool inSolution = true;
for(int xx = minX; xx <= maxX; ++xx)
{
for(int yy = minY; yy <= maxY; ++yy)
{
if(xx == 0 && yy == 0) continue;
if(possibilities[xx + x][yy + y] == 0) continue;
if(possibilities[x][y] > possibilities[xx + x][yy + y])
{
inSolution = false;
xx = maxX + 1; //to break out of two loops
break;
}
}
}
if(inSolution)
{
for(int xx = minX; xx <= maxX; ++xx)
{
for(int yy = minY; yy <= maxY; ++yy)
{
if(xx == 0 && yy == 0) continue;
possibilities[xx + x][yy + y] = 0;
}
}
}
}
int count = 0;
for(int y = 0; y < height; ++y) //printing for debug
{
for(int x = 0; x < width; ++x)
{
std::cout << possibilities[x][y] << ' ';
if(possibilities[x][y] > 0) ++count;
}
std::cout << '\n';
}
std::cout << '\n' << "Count: " << count;
return 0;
}