Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	io := NewIo()
	defer io.Flush()
	for {
		h := io.NextInt()
		if h == 0 {
			break
		}
		p := make([][]int, h)
		for i := 0; i < h; i++ {
			p[i] = make([]int, 5)
			for j := 0; j < 5; j++ {
				p[i][j] = io.NextInt()
			}
		}
		ans := 0
		for {
			sc := puyo(p, h)
			if sc == 0 {
				break
			}
			fall(p, h)
			ans += sc
		}
		io.Println(ans)
	}
}

func puyo(p [][]int, h int) int {
	sc := 0
	for i := 0; i < h; i++ {
		for j := 0; j < 3; j++ {
			var cnt int
			for cnt = 1; j+cnt < 5; cnt++ {
				if p[i][j] != p[i][j+cnt] {
					break
				}
			}
			if cnt > 2 {
				sc += p[i][j]*cnt
				for k := 0; k < cnt; k++ {
					p[i][j+k] = 0
				}
			}
		}
	}
	return sc
}

func fall(p [][]int, h int) {
	for j := 0; j < 5; j++ {
		for k := 1; k < h; k++ {
			for i := h - 1; i >= k; i-- {
				if p[i][j] == 0 {
					p[i][j] = p[i-1][j]
					p[i-1][j] = 0
				}
			}
		}
	}
}

// I/O template
type Io struct {
	reader    *bufio.Reader
	writer    *bufio.Writer
	tokens    []string
	nextToken int
}

func NewIo() *Io {
	return &Io{
		reader: bufio.NewReader(os.Stdin),
		writer: bufio.NewWriter(os.Stdout),
	}
}

func (io *Io) Flush() {
	err := io.writer.Flush()
	if err != nil {
		panic(err)
	}
}

func (io *Io) NextLine() string {
	var buff []byte
	for {
		line, isPrefix, err := io.reader.ReadLine()
		if err != nil {
			panic(err)
		}
		buff = append(buff, line...)
		if !isPrefix {
			break
		}
	}
	return string(buff)
}

func (io *Io) Next() string {
	for io.nextToken >= len(io.tokens) {
		line := io.NextLine()
		io.tokens = strings.Fields(line)
		io.nextToken = 0
	}
	s := io.tokens[io.nextToken]
	io.nextToken++
	return s
}

func (io *Io) NextInt() int {
	i, err := strconv.Atoi(io.Next())
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) NextFloat() float64 {
	i, err := strconv.ParseFloat(io.Next(), 64)
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) Println(a ...interface{}) {
	fmt.Fprintln(io.writer, a...)
}

func (io *Io) Printf(format string, a ...interface{}) {
	fmt.Fprintf(io.writer, format, a...)
}

func (io *Io) PrintIntSlice(a []int) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.Println(b...)
}

func (io *Io) PrintStringSlice(a []string) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.Println(b...)
}

func Log(name string, value interface{}) {
	fmt.Fprintf(os.Stderr, "%s=%+v\n", name, value)
}

func ExampleIo() {
	io := NewIo()
	defer io.Flush()
	a := make([]int, 0, 3)
	a[0], a[1], a[2] = io.NextInt(), io.NextInt(), io.NextInt()
	io.Println(a)
	io.PrintIntSlice(a)
	Log("io", a)
}

C++: #include <bits/stdc++.h>
using namespace std;
int main(){
  while (1){
    int H;
    cin >> H;
    if (H == 0){
      break;
    }
    vector<vector<int>> A(H, vector<int>(7, -1));
    for (int i = 0; i < H; i++){
      for (int j = 1; j <= 5; j++){
        cin >> A[i][j];
      }
    }
    int ans = 0;
    while (1){
      bool update = false;
      for (int i = 0; i < H; i++){
        if (A[i][3] != 0){
          int L = 3;
          while (A[i][L] == A[i][3]){
            L--;
          }
          int R = 3;
          while (A[i][R] == A[i][3]){
            R++;
          }
          if (R - L >= 4){
            for (int j = L + 1; j <= R - 1; j++){
              ans += A[i][j];
              A[i][j] = 0;
              update = true;
            }
          }
        }
      }
      if (!update){
        break;
      }
      for (int i = 1; i <= 5; i++){
        for (int j = H - 2; j >= 0; j--){
          if (A[j][i] != 0){
            int p = j;
            while (A[p + 1][i] == 0){
              swap(A[p][i], A[p + 1][i]);
              p++;
              if (p == H - 1){
                break;
              }
            }
          }
        }
      }
    }
    cout << ans << endl;
  }
}

C++: #ifdef _WIN32
#include "stdc++.h"
#else
#include<bits/stdc++.h>
#endif

#define REP(i,j,k) for(int (i)=(j); (i) < (k); (i)++)
using namespace std;

bool solve()
{
	int h; cin >> h;
	if (h == 0)return false;

	vector<list<int>> ishi(5);
	int ans = 0;

	REP(j, 0, h)
	{
		REP(i, 0, 5)
		{
			int k = 0; cin >> k;
			ishi[i].push_front(k);
		}
	}
	bool atari = true;
	while (atari)
	{
		/*
		for (int i = 0; i < 5; ++i)
		{
			for (auto itr : ishi[i])
				cout << itr << " ";
			cout << endl;
		}
		*/
		atari = false;
		vector<list<int>> newIshi(5);

		while (true)
		{
			bool isEmpty = true;
			for (int i = 0; i < 5; ++i)
			{
				if (!ishi[i].empty())
				{
					isEmpty = false;
				}
			}
			if (isEmpty)
			{
				ishi = newIshi;
				break;
			}


			vector<int> check(5);
			for (int i = 0; i < 5; ++i)
			{
				if (ishi[i].empty())
				{
					check[i] = 0;
				}
				else
				{
					check[i] = ishi[i].front();
					ishi[i].pop_front();
				}
			}
			bool find = false;
			for (int count = 5; count >= 3; --count)
			{
				if (find)break;
				for (int s = 0; s <= 5 - count; ++s)
				{
					bool same = true;
					int n = check[s];
					if (n == 0)break;
					for (int i = s; i < s + count; ++i)
					{
						if (n != check[i]) {
							same = false;
						}
					}
					if (same)
					{
						/*
						cout << n << ":" << count << endl;
						*/
						ans += n * count;
						atari = true;
						find = true;
						REP(i, 0, 5)
						{
							if ((i < s || s + count <= i) && check[i]!=0)
							{
								newIshi[i].push_back(check[i]);
							}
						}

						break;
					}

				}
			}
			if (!find)
			{
				REP(i, 0, 5)
				{
					if (check[i] != 0)
					{
						newIshi[i].push_back(check[i]);
					}
				}
			}
		}
	}

	cout << ans << endl;
	return true;
}

int main()
{
	while (solve())
	{

	}
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
int main(){
  int n,i,j,c;
  while(cin>>n,n!=0){
  int a[n][5],sum=0;;
  for(i=0;i<n;i++)for(j=0;j<5;j++)cin>>a[i][j];
    while(1){
      c=0;
      for(i=0;i<n;i++){
        if(a[i][0]!=0&&a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][2]==a[i][3]&&a[i][3]==a[i][4]){
          sum+=a[i][0]*5;c++;
          a[i][0]=0;a[i][1]=0;a[i][2]=0;a[i][3]=0;a[i][4]=0;
        }
         if(a[i][0]!=0&&a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][2]==a[i][3]){
          sum+=a[i][0]*4;c++;
          a[i][0]=0;a[i][1]=0;a[i][2]=0;a[i][3]=0;
        }
         if(a[i][4]!=0&&a[i][3]==a[i][4]&&a[i][1]==a[i][2]&&a[i][2]==a[i][3]){
          sum+=a[i][1]*4;c++;
          a[i][4]=0;a[i][1]=0;a[i][2]=0;a[i][3]=0;
        }
         if(a[i][2]!=0&&a[i][0]==a[i][1]&&a[i][1]==a[i][2]){
          sum+=a[i][0]*3;c++;
          a[i][0]=0;a[i][1]=0;a[i][2]=0;
        }
         if(a[i][2]!=0&&a[i][3]==a[i][1]&&a[i][1]==a[i][2]){
          sum+=a[i][1]*3;c++;
          a[i][3]=0;a[i][1]=0;a[i][2]=0;
        }
         if(a[i][2]!=0&&a[i][3]==a[i][4]&&a[i][3]==a[i][2]){
          sum+=a[i][2]*3;c++;
          a[i][3]=0;a[i][4]=0;a[i][2]=0;
        }
      }
      if(c==0)break;
      for(int h=0;h<n;h++)for(i=n-1;i>0;i--)for(j=0;j<5;j++){
        if(a[i][j]==0){
          a[i][j]=a[i-1][j];
          a[i-1][j]=0;
        }
      }    
    }
    cout<<sum<<endl;
  }
  return 0;
}