Go: package main

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

var sc = bufio.NewScanner(os.Stdin)
var route [][]int

func scanInt() int {
	num, _ := strconv.Atoi(scanString())
	return num
}

func scanString() string {
	sc.Scan()
	return sc.Text()
}

func init() {
	sc.Split(bufio.ScanWords)
}

func dfs(h, w int) {
	if route[h][w] == 0 {
		return
	}

	route[h][w] = 0
	for _, x := range []int{-1, 0, 1} {
		for _, y := range []int{-1, 0, 1} {
			if route[h+x][w+y] == 0 {
				continue
			}
			dfs(h+x, w+y)
		}
	}
}

func main() {
	writer := bufio.NewWriter(os.Stdout)
	for {
		w, h := scanInt(), scanInt()
		if w == 0 && h == 0 {
			break
		}

		route = make([][]int, h+2)
		route[0] = make([]int, w+2)
		for i := 1; i <= h; i++ {
			route[i] = make([]int, w+2)
			for j := 1; j <= w; j++ {
				route[i][j] = scanInt()
			}
		}
		route[h+1] = make([]int, w+2)

		total := 0
		for i := 1; i <= h; i++ {
			for j := 1; j <= w; j++ {
				if route[i][j] == 1 {
					total++
					dfs(i, j)
				}
			}
		}
		fmt.Fprintln(writer, total)
	}
	writer.Flush()
}

C++: #include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define REP(i,n) for(int i=1;i<=n;i++)
typedef long long ll;

int field[55][55];

int dx[4] = {1,0,-1,0};
int dy[4] = {0, 1, 0, -1};

int w,h;

void dfs(int i, int j){
	field[i][j] = 0;
	for (int k = -1; k <= 1; ++k) {
		for (int l = -1; l <= 1 ; ++l) {
			if(k == 0 && l == 0) continue;
			int x = j + k;
			int y = i + l;
			if(x<0 || x>= w || y<0 || y>=h) continue;
			if(field[y][x] == 1){
				dfs(y,x);
			}
		}
	}
	return ;
}

int main(){
	cin >> w >> h;
	
	while(w != 0 || h != 0) {
		rep(i, h) {
			rep(j, w) {
				cin >> field[i][j];
			}
		}
		
		int ans = 0;
		
		rep(i, h) {
			rep(j, w) {
				if (field[i][j] == 1) {
					dfs(i, j);
					ans++;
				}
			}
		}
		
		cout << ans << endl;
		cin >> w >> h;
	}
    return 0;
}

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

int field[51][51];
int w,h;

void land(int x,int y){
	field[x][y]=0;

	for(int yy=-1;yy<=1;yy++){
		for(int xx=-1;xx<=1;xx++){
			if(x+xx>=0&&x+xx<=w&&y+yy>=0&&y+yy<=h){
			   if(field[x+xx][y+yy]==1) land(x+xx,y+yy);
			}
		}
	}
	return;
}

int main(void){

	int kazu=0;

	scanf("%d %d",&w,&h);

	if(w==0||h==0) return 0;

	for(int i=0;i<h;i++){
		for(int j=0;j<w;j++){
			scanf("%d",&field[j][i]);
		}
	}

	for(int i=0;i<h;i++){
		for(int j=0;j<w;j++){

			if(field[i][j]==1){
				land(i,j);
				kazu++;
			}

		}
	}

	printf("%d",kazu);
	return 0;
}

C++: #include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back 
#define pf push_front 
#define mp make_pair
#define fr first
#define sc second
#define Rep(i,n) for(int i=0;i<(n);i++)
#define All(v) v.begin(),v.end()
typedef pair<int, int> Pii; typedef pair<int, Pii> Pip;
const int INF = 1107110711071107;
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1}, dy[8] = {1, 1, 0, -1, -1, -1, 0, 1};     

int w, h;
bool data[51][51];

void dfs( int y, int x )
{
  data[y][x] = 0;

  Rep(i, 8) {
    int nx = x + dx[i], ny = y + dy[i];
    if( nx < 0 || nx >= w || ny < 0 || ny >= h || !data[ny][nx] ) continue;
    dfs( ny, nx );
   }
}


main()
{
  while( cin >> w >> h, !(w == 0 && h == 0) ) {
    
    Rep(i, h) Rep(j, w) cin >> data[i][j];

    int cnt = 0;
    Rep(i, h) Rep(j, w) {
      if( data[i][j] ) dfs(i, j), cnt++; 
    }

    cout << cnt << endl;
  }
   
}

C++: #include "bits/stdc++.h"

using namespace std;

using ll = long long;

template<typename T> using V = std::vector<T>;
using Vi = V<int>;
using VVi = V<V<int>>;
using Vl = V<ll>;
using VVl = V<V<ll>>;
using Vs = V<string>;

template<typename T1, typename T2> using P = std::pair<T1, T2>;
using Pii = P<int, int>;
using Pll = P<ll, ll>;
using Pdd = P<double, double>;

template<typename T1, typename T2> using M = std::map<T1, T2>;
using Mii = M<int, int>;
using Msi = M<string, int>;

#define REP(i,n) for(int i=0;i<(int)(n);++i)
#define REP2(i,s,e) for(int i=(int)(s);i<(int)(e);++i)
#define RREP(i,s,e) for(int i=(int)(s);i>=(int)(e);--i)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin(),ie=(c).end();i!=ie;++i)
#define ALL(c) (c).begin(), (c).end()

const double PI = acos(-1);
const ll MOD = 1e9+7;

int n, w, h;
string s;
V<Pii> dir = {{1, 0}, {1, 1}, {1, -1}, {0, 1}, {0, -1}, {-1, 0}, {-1, 1}, {-1, -1}};

int main() {
    while (true) {
        cin >> w >> h;
        if (w == 0 && h == 0) {
            break;
        }

        VVi land(h, Vi(w));
        REP(i, h) REP(j, w) cin >> land[i][j];

        int res = 0;
        stack<Pii> s;
        while (true) {
            REP(i, h) {
                REP(j, w) {
                    if (land[i][j] == 1) {
                        s.push({i, j});
                        break;
                    }
                }
                if (!s.empty()) break;
            }
            if (s.empty()) break;

            res++;
            while (!s.empty()) {
                int y = s.top().first, x = s.top().second;
                s.pop();
                if (land[y][x] == 0) continue;
                land[y][x] = 0;
                FOR(i, dir) {
                    int Y = y + i->first, X = x + i->second;
                    if (Y < 0 || X < 0 || Y >= h || X >= w) continue;
                    if (land[Y][X] == 0) continue;
                    s.push({Y, X});
                }
            }
        }
        std::cout << res << '\n';
    }

    return 0;
}

C++: 
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <math.h>
#include <utility>
#include <set>
#include <map>
#define INF 100000
#define rep(i,n) for(int i =0;i<n;i++)
using namespace std;
typedef long long int ll;

#define MAX 5000

int G[51][51];
int h,w;


void dfs(int x, int y){
    /*for (int i=0; i<h; i++) {
        for (int j=0; j<w; j++) {
            cout <<G[i][j]<<" ";
        }
        cout << endl;
    }
    cout << endl;*/
    if(x<0||x>=h||y<0||y>=w) return;
    for (int i=-1; i<=1 ; i++) {
        if(x+i>=h or x+i<0) continue;
        for (int j=-1; j<=1; j++) {
            if(y+j>=w or y+j < 0) continue;
            if (G[x+i][y+j]==1) {
                G[x+i][y+j]=0;
                dfs(x+i,y+j);
            }
        }
    }
}


int main(){
    for(;;){
        cin >> w >> h;
        if(w==0 and h == 0) break;
        int ans=0;
        for (int i=0; i<h; i++) {
            for (int j=0; j<w; j++) {
                G[i][j]=0;
            }
        }
        for (int i = 0; i<h;i++) {
            for (int j=0; j < w; j++) {
                cin >> G[i][j];
            }
        }
        for (int i=0; i<h; i++) {
            for (int j=0; j<w; j++) {
                if (G[i][j]==1) {
                    G[i][j]=0;
                    ans++;
                    dfs(i,j);
                }
            }
        }
        cout << ans <<endl;
    }
    return 0;
}

C++: // AOJ 1160
#include<cstdio>
#define rep(i,a) for( int i = 0; i != (a); ++i )

const int dx[8] = { 0, 1, 1, 1, 0, -1, -1, -1 }, dy[8] = { -1, -1, 0, 1, 1, 1, 0, -1 };

int w, h;
bool c[50][50];

void dfs( int y, int x )
{
	c[y][x] = false;

	rep( i, 8 )
	{
		int nx = x+dx[i], ny = y+dy[i];

		if( nx >= 0 && nx < w && ny >= 0 && ny < h && c[ny][nx] )
			dfs( ny, nx );
	}

	return;
}

int main()
{
	while( scanf( "%d%d", &w, &h ), w|h )
	{
		rep( i, h )
			rep( j, w )
				scanf( "%d", &c[i][j] );

		int ans = 0;
		rep( i, h )
			rep( j, w )
				if( c[i][j] )
					dfs( i, j ), ++ans;

		printf( "%d\n", ans );
	}

	return 0;
}