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 <iostream>
using namespace std;

// これは昔落ちものゲームを作ったことがあるので、事実上やったことがある。しかし忘れてしまった。即興で解くしかない。

int H;
int S[10][5];

int shokyo_1(int r) { // 消去部分に0を入れ、得点を返す
  for (int i=5; i>=3; i--) { // 消去個数
    for (int j=0; j<=5-i; j++) { // 判定開始地点
      int temp = S[r][j];
      bool ok = true;
      if (temp == 0) continue;
      for (int k=j; k<j+i; k++) {
	if (temp != S[r][k]) {
	  // cerr << "r = " << r << ", i = " << i << ", j = " << j << ", k = " << k << ", S[r][k] = " << S[r][k] << endl;
	  ok = false;
	  break;
	}
      }
      if (ok) {
	// cerr << "r = " << r << ", i = " << i << ", j = " << j << endl;
	for (int k=j; k<j+i; k++) {
	  S[r][k] = 0;
	}
	return temp * i;
      }
    }
  }
  return 0;
}

int shokyo() {
  int sum = 0;
  for (int i=0; i<H; i++) {
    sum += shokyo_1(i);
  }
  return sum;
}

void swap(int r_0, int c_0, int r_1, int c_1) {
  int temp1 = S[r_1][c_1];
  S[r_1][c_1] = S[r_0][c_0];
  S[r_0][c_0] = temp1;
  // cerr << "r_0 = " << r_0 << ", c_0 = " << c_0 << ", r_1 = " << r_1 << ", c_1 = " << c_1 << ", temp1 = " << temp1 << endl;
}

void tsumeru_1(int c) {
  for (int i=H-1; i>=1; i--) {
    // cerr << "i = " << i << endl;
    if (S[i][c] == 0) {
      for (int j=i-1; j>=0; j--) {
	// cerr << "j = " << j << endl;
	if (S[j][c] != 0) {
	  swap(i, c, j, c);
	  break;
	}
      }
    }
  }
}

void tsumeru() {
  for (int c=0; c<5; c++) {
    tsumeru_1(c);
  }
}

int main() {
  while (scanf("%d", &H) != EOF && H) {
    for (int i=0; i<H; i++) {
      for (int j=0; j<5; j++) {
	scanf("%d", &S[i][j]);
      }
    }
    int sum = 0;
    int temp;
    while (true) {
      temp = shokyo();
      if (temp == 0) break;
      /*cerr << "--now--" << endl;
      for (int i=0; i<H; i++) {
	for (int j=0; j<5; j++) {
	  cerr << S[i][j] << " ";
	}
	cerr << endl;
      }
      cerr << "--end--" << endl;*/
      sum += temp;
      tsumeru();
    }
    printf("%d\n", sum);
  }
}

C++: #include <iostream>

using namespace std;

#define H 10

int map[10][5];

int calc_and_remove() {
  int res = [&]{
    int res = 0;
    for(int i = 0; i < H; i++) {
      for(int j = 0; j < 5; j++) {
        int left = j;
        int right = left;
        int prev = map[i][left];
        while(right < 5  && map[i][right] && map[i][right] == prev) right++;
        if (right - left >= 3) {
          for(int k = left; k < right; k++) {
            res += map[i][k];
            map[i][k] = 0;
          }
        }
      }
    }
    return res;
  }();

  for(int i = H-1; i >= 0; i--) {
    for(int j = 0; j < 5; j++) {
      int cnt = 0;
      while (map[i][j] == 0 && cnt < 5) {
        for(int k = i; k >= 0; k--) {
          if (k-1 == -1) {
            map[k][j] = 0;
          }
          else {
            map[k][j] = map[k-1][j];
          }
        }
        cnt ++;
      }
    }
  }

  return res;
}

int main() {
  int h;
  while(cin >> h, h) {
    memset(map, 0, H*5*sizeof(int));
    for(int i = 0; i < h; i++)
      for(int j = 0; j < 5; j++)
        cin >> map[i+(10-h)][j];

    int res = 0;
    for(int k = 0; k < 20; k++) {
      res += calc_and_remove();
    }

    cout << res << endl;
  }

  return 0;
}

C++: #include<iostream>
#include<math.h>

using namespace std;

int h;
int field[15][5];
int changed[15][5];
int main(){
	while(1){
		int ans=0;
		cin >>h;
		if(h==0)break;
		for(int i=0;i<h;i++){
			for(int j=0;j<5;j++){
				cin >> field[i][j];
			}
		}
		for(int i=0;i<15;i++){
			for(int j=0;j<5;j++){
				changed[i][j]=0;
			}
		}
		int b=0;
		while(1){
			b++;
			bool ok=true;
			for(int i=h-1;i>=0;i--){
				for(int j=0;j<3;j++){
					if(field[i][j]==field[i][j+1]&&field[i][j]>0){
						int cnt=0;
						int copy=field[i][j];
						while(copy==field[i][j]&&j<5){
							cnt++;
							j++;
						}
						if(cnt>2){
							j-=cnt;
							for(int k=j;k<5;k++){
								if(copy==field[i][k]){
									changed[i][k]=1;
								}
								else break;
							}
							j+=cnt;
						}
						j--;
					}
				}
			}
			for(int i=0;i<h;i++){
			for(int j=0;j<5;j++){
				if(changed[i][j]==1){
					ok=false;

						ans+=field[i][j];
						for(int k=i;k>0;k--){
							field[k][j]=(field[k-1][j]>0?field[k-1][j]:-1);
							
						}
						field[0][j]=0;
				
				}
			}
		}
		for(int i=0;i<12;i++){
			for(int j=0;j<5;j++){
				changed[i][j]=0;
			}
		}
		if(ok)break;
		}
		cout << ans << endl;
	}
}