Problem:
Dropping Ink

As shown in the following figure, there is a paper consisting of a grid structure where each cell is indicated by (x, y) coordinate system.

We are going to put drops of ink on the paper. A drop comes in three different sizes: Large, Medium, and Small. From the point of fall, the ink sinks into surrounding cells as shown in the figure depending on its size. In the figure, a star denotes the point of fall and a circle denotes the surrounding cells.

Originally, the paper is white that means for each cell the value of density is 0. The value of density is increased by 1 when the ink sinks into the corresponding cells.

For example, if we put a drop of Small ink at (1, 2) and a drop of Medium ink at (3, 2), the ink will sink as shown in the following figure (left side):

In the figure, density values of empty cells are 0. The ink sinking into out of the paper should be ignored as shown in the figure (top side). We can put several drops of ink at the same point.

Your task is to write a program which reads a sequence of points of fall (x, y) with its size (Small = 1, Medium = 2, Large = 3), and prints the number of cells whose density value is 0. The program must also print the maximum value of density.

You may assume that the paper always consists of 10 × 10, and 0 ≤ x < 10, 0 ≤ y < 10.

Input

x1,y1,s1
x2,y2,s2
:
:

(xi, yi) represents the position of the i-th drop and si denotes its size. The number of drops is less than or equal to 50.

Output

Print the number of cells whose density value is 0 in first line.

Print the maximum value of density in the second line.

Sample Input

2,5,3
3,6,1
3,4,2
4,5,2
3,6,3
2,4,1

Output for the Sample Input

77
5

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _0026
{
    class Program
    {
        const int _sheetWidth = 10;
        const int _sheetHeight = 10;
        static void Main(string[] args)
        {
            Coloring coloring = new Coloring();
            Calclation calclation = new Calclation();
            int[][] sheet = new int[_sheetWidth][];
            for (int i = 0; i < _sheetWidth; ++i)
            {
                sheet[i] = new int[_sheetHeight];
            }
            string droppingInfo = "";
            while ((droppingInfo = Console.ReadLine()) != null)
            {
                int[] order = droppingInfo.Split(',').Select(int.Parse).ToArray();
                coloring.DroppingInk(ref sheet, order);
            }
            Console.WriteLine(calclation.CountValueIs0In2D(sheet));
            Console.WriteLine(calclation.MaxIn2D(sheet));
        }
    }
    class Coloring
    {
        internal void DroppingInk(ref int[][] sheet, int[] order)
        {
            int x = order[0];
            int y = order[1];
            int size = order[2];
            if (size == 1)
            {
                InkSmall(ref sheet, x, y);
            }
            if (size == 2)
            {
                InkMidium(ref sheet, x, y);
            }
            if (size == 3)
            {
                InkBig(ref sheet, x, y);
            }
        }
        internal void InkBig(ref int[][] sheet, int x, int y)
        {
            InkMidium(ref sheet, x, y);
            if (x <= 1)
            {
                if (y <= 1)
                {
                    sheet[x][y + 2] += 1;
                    sheet[x + 2][y] += 1;
                }
                else if (y >= 8)
                {
                    sheet[x][y - 2] += 1;
                    sheet[x + 2][y] += 1;
                }
                else
                {
                    sheet[x][y - 2] += 1;
                    sheet[x][y + 2] += 1;
                    sheet[x + 2][y] += 1;
                }
            }
            else if (x >= 8)
            {
                if (y <= 1)
                {
                    sheet[x][y + 2] += 1;
                    sheet[x - 2][y] += 1;
                }
                else if (y >= 8)
                {
                    sheet[x][y - 2] += 1;
                    sheet[x - 2][y] += 1;
                }
                else
                {
                    sheet[x][y - 2] += 1;
                    sheet[x][y + 2] += 1;
                    sheet[x - 2][y] += 1;
                }
            }
            else if (y <= 1)
            {
                sheet[x][y + 2] += 1;
                sheet[x - 2][y] += 1;
                sheet[x + 2][y] += 1;
            }
            else if (y >= 8)
            {
                sheet[x][y - 2] += 1;
                sheet[x - 2][y] += 1;
                sheet[x + 2][y] += 1;
            }
            else
            {
                sheet[x][y - 2] += 1;
                sheet[x][y + 2] += 1;
                sheet[x - 2][y] += 1;
                sheet[x + 2][y] += 1;
            }
        }
        internal void InkMidium(ref int[][] sheet, int x, int y)
        {
            InkSmall(ref sheet, x, y);
            if (x == 0)
            {
                if (y == 0)
                {
                    sheet[x + 1][y + 1] += 1;
                }
                else if (y == 9)
                {
                    sheet[x + 1][y - 1] += 1;
                }
                else
                {
                    sheet[x + 1][y - 1] += 1;
                    sheet[x + 1][y + 1] += 1;
                }
            }
            else if (x == 9)
            {
                if (y == 0)
                {
                    sheet[x - 1][y + 1] += 1;
                }
                else if (y == 9)
                {
                    sheet[x + 1][y - 1] += 1;
                }
                else
                {
                    sheet[x - 1][y - 1] += 1;
                    sheet[x - 1][y + 1] += 1;
                }
            }
            else if (y == 0)
            {
                sheet[x - 1][y + 1] += 1;
                sheet[x + 1][y + 1] += 1;
            }
            else if (y == 9)
            {
                sheet[x - 1][y - 1] += 1;
                sheet[x + 1][y - 1] += 1;
            }
            else
            {
                sheet[x - 1][y - 1] += 1;
                sheet[x + 1][y - 1] += 1;
                sheet[x - 1][y + 1] += 1;
                sheet[x + 1][y + 1] += 1;
            }
        }
        internal void InkSmall(ref int[][] sheet, int x, int y)
        {
            if (x == 0)
            {
                if (y == 0)
                {
                    sheet[x][y + 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x + 1][y] += 1;
                }
                else if (y == 9)
                {
                    sheet[x][y - 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x + 1][y] += 1;
                }
                else
                {
                    sheet[x][y - 1] += 1;
                    sheet[x][y + 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x + 1][y] += 1;
                }
            }
            else if (x == 9)
            {
                if (y == 0)
                {
                    sheet[x][y + 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x - 1][y] += 1;
                }
                else if (y == 9)
                {
                    sheet[x][y - 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x - 1][y] += 1;
                }
                else
                {
                    sheet[x][y - 1] += 1;
                    sheet[x][y + 1] += 1;
                    sheet[x][y] += 1;
                    sheet[x - 1][y] += 1;
                }
            }
            else if (y == 0)
            {
                sheet[x][y + 1] += 1;
                sheet[x][y] += 1;
                sheet[x - 1][y] += 1;
                sheet[x + 1][y] += 1;
            }
            else if (y == 9)
            {
                sheet[x][y - 1] += 1;
                sheet[x][y] += 1;
                sheet[x - 1][y] += 1;
                sheet[x + 1][y] += 1;
            }
            else
            {
                sheet[x][y - 1] += 1;
                sheet[x][y + 1] += 1;
                sheet[x][y] += 1;
                sheet[x - 1][y] += 1;
                sheet[x + 1][y] += 1;
            }
        }
    }
    class Calclation
    {
        internal int CountValueIs0In2D(int[][] sheet)
        {
            int zeroCounter = 0;
            for (int i = 0; i < sheet.Length; ++i)
            {
                for (int j = 0; j < sheet[i].Length; ++j)
                {
                    if (sheet[i][j] == 0)
                    {
                        ++zeroCounter;
                    }
                }
            }
            return zeroCounter;
        }
        internal int MaxIn2D(int[][] sheet)
        {
            int max = 0;
            for (int i = 0; i < sheet.Length; ++i)
            {
                for (int j = 0; j < sheet[i].Length; ++j)
                {
                    if (max < sheet[i][j])
                    {
                        max = sheet[i][j];
                    }
                }
            }
            return max;
        }
    }
}