#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000
int map[SIZE+2][SIZE+2]={0};
int run_test(const char data[SIZE][SIZE])
{
for(int i=0;i<SIZE+2;i++){
for(int j=0;j<SIZE+2;j++){
map[i][j]=0;
}
}
for(int i=0;i<SIZE;i++){
for(int j=0;j<SIZE;j++){
if(data[i][j]!=0)map[i+1][j+1]++;
}
}
int count=0;
for(int i=1;i<SIZE+1;i++){
for(int j=1;j<SIZE+1;j++){
if(map[i][j]==1&&map[i+1][j]==1&&map[i][j+1]==1&&map[i+1][j+1]==1){
count++;
map[i][j]=0;map[i+1][j]=0;
map[i][j+1]=0;map[i+1][j+1]=0;
}
if(map[i][j]==1&&map[i+1][j]==1&&map[i+1][j+1]==1){
count++;
map[i][j]=0;map[i+1][j]=0;
map[i+1][j+1]=0;
}
if(map[i][j]==1&&map[i+1][j]==1&&map[i][j+1]==1){
count++;
map[i][j]=0;map[i+1][j]=0;
map[i][j+1]=0;
}
if(map[i][j]==1&&map[i][j+1]==1&&map[i+1][j+1]==1){
count++;
map[i][j]=0;
map[i][j+1]=0;map[i+1][j+1]=0;
}
if(map[i][j]==0&&map[i+1][j]==1&&map[i][j+1]==1&&map[i+1][j+1]==1){
count++;
map[i+1][j]=0;
map[i][j+1]=0;map[i+1][j+1]=0;
}
if(map[i][j]==1&&map[i+1][j]==1){
count++;
map[i][j]=0;map[i+1][j]=0;
}
if(map[i][j]==1&&map[i][j+1]==1){
count++;
map[i][j]=0;
map[i][j+1]=0;
}
if(map[i][j]==1){
count++;
map[i][j]=0;
}
}
}
return count;
}
MoldType CheckMold(char data[SIZE][SIZE], int x, int y)
{
if((x+1<=SIZE)&&(y+1<=SIZE)&&data[x][y]&&data[x][y+1]&&data[x+1][y]&&data[x+1][y+1])
{
data[x][y]=0;
data[x][y+1]=0;
data[x+1][y]=0;
data[x+1][y+1]=0;
return ABCD;
}
else if((x+1<=SIZE)&&(y+1<=SIZE)&&data[x][y]&&data[x][y+1]&&data[x+1][y])
{
data[x][y]=0;
data[x][y+1]=0;
data[x+1][y]=0;
return ABC;
}
else if((x+1<=SIZE)&&(y+1<=SIZE)&&data[x][y]&&data[x][y+1]&&data[x+1][y+1])
{
data[x][y]=0;
data[x][y+1]=0;
data[x+1][y+1]=0;
return ABD;
}
else if((x+1<=SIZE)&&(y+1<=SIZE)&&data[x][y]&&data[x+1][y]&&data[x+1][y+1])
{
data[x][y]=0;
data[x+1][y]=0;
data[x+1][y+1]=0;
return ACD;
}
else if((x+1<=SIZE)&&(y+1<=SIZE)&&!data[x][y]&&data[x][y+1]&&data[x+1][y]&&data[x+1][y+1])
{
data[x][y+1]=0;
data[x+1][y]=0;
data[x+1][y+1]=0;
return BCD;
}
else if((y+1<=SIZE)&&data[x][y]&&data[x][y+1])
{
data[x][y]=0;
data[x][y+1]=0;
return AB;
}
else if((x+1<=SIZE)&&data[x][y]&&data[x+1][y])
{
data[x][y]=0;
data[x+1][y]=0;
return AC;
}
else if(data[x][y])
{
data[x][y]=0;
return A;
}
else return NONE;
}
int run_test( char data[SIZE][SIZE])
{
int count=0;
for(int i=0; i<SIZE; i++)
{
for(int j=0; j<SIZE; j++)
{
MoldType result = CheckMold(data, i, j);
if(result!=NONE)count++;
}
//DrawArray(data);
}
return count;
}
static char data[10][SIZE][SIZE];
void build_data(void)
{
static char virus[8][4][4] =
{
{{ 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }}
};
for (int l = 0; l < 10; l++)
{
for (int y = 0; y < SIZE; y++)
for (int x = 0; x < SIZE; x++)
data[l][x][y] = 0;
for (int c = 0; c < SIZE * SIZE; c++)
{
int x = rand() % (SIZE - 4);
int y = rand() % (SIZE - 4);
int t = rand() % 8;
for (int cy = 0; cy < 4; cy++)
for (int cx = 0; cx < 4; cx++)
data[l][x + cx][y + cy] = virus[t][cx][cy];
}
}
}
void main(int argc, char* argv[])
{
build_data();
for (int c = 0; c < 10; c++)
printf("%d\n", run_test(data[c]));
}