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>
typedef long long ll;
using namespace std;
#define repr(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define invrepr(i,a,b) for(int i=b-1;i>=a;i--)
#define invrep(i,n) invrepr(i,0,n)
#define repitr(itr,a) for(auto itr=a.begin();itr!=a.end();++itr)
const ll MOD=1e9+7;

int main() {
    ios_base::sync_with_stdio(false);

    while (1) {
        int w,h;
        cin >> w >> h; 
        if (w==0 && h==0) break;
        vector<vector<char>> s(h+2,vector<char>(w+2,'0'));
        rep(i,h) {
            rep(j,w) cin >> s[i+1][j+1];
        }
        int ans=0;
        vector<int> di={-1,-1,-1,0,0,1,1,1},dj={-1,0,1,-1,1,-1,0,1};
        repr(i,1,h+1) {
            repr(j,1,w+1) {
                if (s[i][j]=='1') {
                    queue<pair<int,int>> q;
                    q.push(make_pair(i,j));
                    s[i][j]='0'; 
                    while (!q.empty()) {
                        pair<int,int> p=q.front();
                        q.pop();
                        rep(k,8) {
                            int ni=p.first+di[k],nj=p.second+dj[k];
                            if (s[ni][nj]=='1') {
                                q.push(make_pair(ni,nj));
                                s[ni][nj]='0';
                            }
                        }
                    }
                    ++ans;
                }
            }
        }
        cout << ans << endl;
    }
    
    return 0;
}

C++: #include <iostream>
#include<vector>
using namespace std;

int w,h;
int c[50][50];
vector<vector<int> > visited;
int dx[]={1,1,0,-1,-1,-1,0,1};
int dy[]={0,-1,-1,-1,0,1,1,1};

bool dfs(int x,int y){
    if(visited[x][y]) return false;
    visited[x][y]=1;

    for(int d=0;d<8;d++){
        int i=x+dx[d];
        int j=y+dy[d];
        if(0<=i&&i<h&&0<=j&&j<w){
            if(c[i][j]){
                dfs(i,j);
            }  
        }
    }
    return true;
}

int main(){
    visited.assign(50,vector<int>(50,0));
    cin>>w>>h;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    int cnt=0;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(c[i][j]){
                cnt+=dfs(i,j);
            }
        }
    }

    cout<<cnt<<endl;
    return 0;
}

C++: #include <iostream>
using namespace std;
void erase(int island[52][52],int x,int y){
	island[x][y]=0;
	for(int m=-1;m<=1;m++){
		if(island[x+m][y]==1){
			erase(island,x+m,y);
		}
		if(island[x][y+m]==1){
			erase(island,x,y+m);
		}
		if(island[x+m][y+m]==1){
			erase(island,x+m,y+m);
		}
		if(island[x-m][y+m]==1){
			erase(island,x-m,y+m);
		}
	}
}
int main(){
	int w,h;
	while(cin>>w>>h){
		if(w==0 && h==0) break;
		int island[52][52]={0};
		int num,count=0;		
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				cin>>num;
				island[i+1][j+1]=num;
			}
		}
		for(int i=1;i<h+1;i++){
			for(int j=1;j<w+1;j++){
				if(island[i][j]==1){
					erase(island,i,j);
					count++;
				}
			}
		}
		cout<<count<<endl;
	}
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 1e9 + 7;
const ll LINF = 1e18;
template <class T>
bool chmax(T& a, const T& b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
bool chmin(T& a, const T& b) {
    if (b < a) {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
vector<T> make_vec(size_t a) {
    return vector<T>(a);
}
template <class T, class... Ts>
auto make_vec(size_t a, Ts... ts) {
    return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

int main() {
    while (1) {
        int w, h;
        cin >> w >> h;
        if (w == 0 && h == 0) break;
        auto v = make_vec<int>(h, w);
        rep(i, h) rep(j, w) cin >> v[i][j];
        int cnt = 0;
        auto used = make_vec<bool>(h, w);
        rep(i, h) rep(j, w) {
            if (!used[i][j] && v[i][j] == 1) {
                queue<pair<int, int>> q;
                q.push(make_pair(i, j));
                while (sz(q)) {
                    int y, x;
                    tie(y, x) = q.front();
                    q.pop();
                    for (int dy = -1; dy <= 1; dy++) {
                        for (int dx = -1; dx <= 1; dx++) {
                            if (dy == 0 && dx == 0) continue;
                            int ny = y + dy;
                            int nx = x + dx;
                            if (!(0 <= ny && ny < h && 0 <= nx && nx < w))
                                continue;
                            if (v[ny][nx] == 0 || used[ny][nx]) continue;
                            q.push(make_pair(ny, nx));
                            used[ny][nx] = 1;
                        }
                    }
                }
                cnt++;
            }
        }
        cout << cnt << endl;
    }
}

C++: #include<iostream>
using namespace std;
int map[114][514];
void dfs(int i, int j) {
	map[i][j] = 0;
	for (int a = -1; a < 2; a++) {
		for (int b = -1; b < 2; b++) {
			if (map[i + a][b + j] == 1)dfs(i + a, b + j);
		}
	}
	return;
}
int main() {
	int h, w; 
	while (cin >> h >> w, h, w) {
		for (int i = 1; i <= w; i++) {
			for (int j = 1; j <= h; j++) {
				cin >> map[i][j];
			}
		}
		int ans = 0;
		for (int i = 1; i <= w; i++) {
			for (int j = 1; j <= h; j++) {
				if (map[i][j]) {
					dfs(i, j);
					ans++;
				}
			}
		}
		cout << ans << endl;
	}
}