Problem:
Chain Disappearance Puzzle

We are playing a puzzle.
An upright board with H rows by 5 columns of cells, as shown in
the figure below, is used in this puzzle.
A stone engraved with a digit, one of 1 through 9, is placed in each of
the cells.
When three or more stones in horizontally adjacent cells are engraved
with the same digit, the stones will disappear.
If there are stones in the cells above the cell with a disappeared
stone, the stones in the above cells will drop down, filling the
vacancy.

The puzzle proceeds taking the following steps.

When three or more stones in horizontally adjacent cells are
engraved with the same digit, the stones will disappear. Disappearances
of all such groups of stones take place simultaneously.

When stones are in the cells above the emptied cells, these stones drop down so that the emptied cells are filled.

After the completion of all stone drops, if one or more groups of
stones satisfy the disappearance condition, repeat by returning to the
step 1.

The score of this puzzle is the sum of the digits on the disappeared stones.

Write a program that calculates the score of given configurations of stones.

Input

The input consists of multiple datasets.
Each dataset is formed as follows.

Board height H

Stone placement of the row 1

Stone placement of the row 2

...

Stone placement of the row H

The first line specifies the height ( H ) of the puzzle board (1 ≤ H ≤ 10).
The remaining H lines give placement of stones on each of the rows from top to bottom.
The placements are given by five digits (1 through 9), separated by a space.
These digits are engraved on the five stones in the corresponding row, in the same order.

The input ends with a line with a single zero.

Output

For each dataset, output the score in a line.
Output lines may not include any characters except the digits expressing the scores.

Sample Input

1
6 9 9 9 9
5
5 9 5 5 9
5 5 6 9 9
4 6 3 6 9
3 3 2 9 9
2 2 1 1 1
10
3 5 6 5 6
2 2 2 8 3
6 2 5 9 2
7 7 7 6 1
4 6 6 4 9
8 9 1 1 8
5 6 1 8 1
6 8 2 1 2
9 6 3 3 5
5 3 8 8 8
5
1 2 3 4 5
6 7 8 9 1
2 3 4 5 6
7 8 9 1 2
3 4 5 6 7
3
2 2 8 7 4
6 5 7 7 7
8 8 9 9 9
0

Output for the Sample Input

36
38
99
0
72

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using static System.Console;
using static System.Math;
 
public class Solve{
    static public int mod = 1000000007;
    public static void Main(){
        // 方針
        //
        while(true){
            var n = rint();
            if(n == 0) break;
            var a = inta2(n,5);
            var total = 0;
            var point = 0;
            while(true){
                for(int i=0;i<n;i++){
                    var nowno = -1;
                    var counter = 0;
                    var st = -1;
                    //var en = -1;
                    for(int j=0;j<5;j++){
                        if(nowno == -1){
                            nowno = a[i,j];
                            counter = 1;
                            st = j;
                        }else{
                            if(nowno != a[i,j]){
                                if(counter >= 3){
                                    point += counter * nowno;
                                    for(int k=st;k<st+counter;k++){
                                        a[i,k] = -1;
                                    }
                                }
                                nowno = a[i,j];
                                counter = 1;
                                st = j;
                            }else{
                                counter++;
                            }
                        }
                    }
                    if(counter >= 3){
                        point += counter* nowno;
                        for(int k=st;k<st+counter;k++){
                            a[i,k] = -1;
                        }
                    }
                }
                for(int i=0;i<5;i++){
                    var olist = new List<int>();
                    var counter1 = 0;
                    for(int j=n-1;j>=0;j--){
                        olist.Add(a[j,i]);
                        if(a[j,i] == -1) counter1++;
                    }
                    for(int j=olist.Count-1;j>=0;j--){
                        if(olist[j] == -1) olist.RemoveAt(j);
                    }
                    for(int j=0;j<counter1;j++){
                        olist.Add(-1);
                    }
                    olist.Reverse();
                    for(int j=0;j<n;j++){
                        a[j,i] = olist[j];
                    }
                }
                
                
                if(total == point){
                    break;
                }else{
                    total = point;
                }
            }
            //WriteArray(a,n,5);
            WriteLine(total);
        }
        
        
        
        
        
        
        
        
        
        
    }
    // 1からaまでの数字並べ替え全通り返すやつ
    static List<string> permutation(int a){var list = new List<string>();if(a == 1){list.Add("1");return list;}else{foreach(var k in permutation(a-1)){var ch = k.ToCharArray();for(int i=0;i<=ch.Length;i++){string intemp = "";if(i == 0){intemp += a.ToString();}for(int j=0;j<ch.Length;j++){intemp += ch[j].ToString();if(i == j+1){intemp += a.ToString();}}list.Add(intemp);}}}return list;}
    public static void swap(ref int a,ref int b){int temp = a;a= b;b = temp;}
    static void charswap(ref char a,ref char b){char temp = a;a= b;b = temp;}
    static int ncr(int n,int r){r = Min(r,n-r);long nn = 1;for(int i=n-r+1;i<=n;i++){nn = nn*i%mod;}long rr = 1;for(int i=1;i<=r;i++){rr = rr*i%mod;}rr = square((int)rr,mod-2);nn = nn * rr %mod;return (int)nn;}
    // a^b mod
    static int square(int a,int b){string binary = Convert.ToString(b,2);int bileng = binary.Length;long a_power = a;long value = 1;for(int i=bileng-1;i>=0;i--){if(binary[i] == '1'){value = value*a_power%mod;}a_power = a_power*a_power%mod;}return (int)value;}
    static int square2(int a,int b){long output = 1;var list = new List<long>();int sh = 1;long n = a;list.Add(a);while(sh < b){sh *= 2;n = n*n%mod;list.Add(n);}for(int i=list.Count-1;i>=0;i--){if(b > sh){b -= sh;sh /= 2;output = output*list[i]%mod;}}return (int)output;}
    //各種読取
    static string rstr(){ return ReadLine(); }
    static int rint(){ return int.Parse(ReadLine()); }
    static long rlong(){ return long.Parse(ReadLine()); }
    static string[] stra(){ return ReadLine().Split(' '); }
    static char[] chara(){ string[] a=stra();string b="";for(int i=0;i<a.Length;i++){b+=a[i];}return b.ToCharArray();}
    static int[] inta(){ string[] read_str_array = ReadLine().Split(' '); int[] return_int_array = new int[read_str_array.Length]; for(int countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_int_array[countup_i] = int.Parse(read_str_array[countup_i]); } return return_int_array; }
    static int[,] inta2(int num_array,int in_array){ int[,] int_array2 = new int[num_array,in_array]; for(int i=0;i<num_array;i++){ int[] temp_array = inta(); for(int j=0;j<in_array;j++){ int_array2[i,j] = temp_array[j]; } } return int_array2; }
    static long[] longa(){ string[] read_str_array = ReadLine().Split(' '); long[] return_long_array = new long[read_str_array.Length]; for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_long_array[countup_i] = long.Parse(read_str_array[countup_i]); } return return_long_array; }
    static double[] doublea(){ string[] read_str_array = ReadLine().Split(' '); double[] return_double_array = new double[read_str_array.Length]; for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_double_array[countup_i] = long.Parse(read_str_array[countup_i]); } return return_double_array; }
    // -----------------------------
    static long divideup(long divided,long divid){ long temp_divide = divided/divid; if(divided % divid > 0){ temp_divide++; } return temp_divide; }
    static long GCD(long a,long b){ if(a < b){ long temp = a; a = b; b = temp; } if(a % b == 0){ return b; } else{ long temp = b; b = a%b; a = temp; return GCD(a,b); } }
    static long LCM(long a,long b){ return a * b / GCD(a,b); }
    static void WriteArray(int[,] a,int b,int c){for(int i=0;i<b;i++){for(int j=0;j<c;j++){if(j!=0) Write(" ");Write(a[i,j]);}WriteLine();}}
}