Go: package main

import (
	"fmt"
)

func main() {
	var h, w int
	for {
		fmt.Scan(&w, &h)
		if w == 0 && h == 0 {
			return
		}
		matrix := make([][]int, h)
		Sean := make([][]bool, h)
		for i := 0; i < h; i++ {
			matrix[i] = make([]int, w)
			Sean[i] = make([]bool, w)
			for j := 0; j < w; j++ {
				fmt.Scan(&matrix[i][j])
			}
		}
		var count int
		for i := 0; i < h; i++ {
			for j := 0; j < w; j++ {
				if matrix[i][j] == 1 && Sean[i][j] == false {
					search(i, j, h, w, matrix, Sean)
					count++
				}
			}
		}
		fmt.Println(count)
	}
}
func search(x int, y int, h int, w int, matrix [][]int, Sean [][]bool) {
	if x < 0 || y < 0 || x >= h || y >= w || matrix[x][y] == 0 {
		return
	}
	if Sean[x][y] == true {
		return
	}

	Sean[x][y] = true

	search(x+1, y, h, w, matrix, Sean)
	search(x-1, y, h, w, matrix, Sean)
	search(x, y+1, h, w, matrix, Sean)
	search(x, y-1, h, w, matrix, Sean)
	search(x+1, y-1, h, w, matrix, Sean)
	search(x-1, y+1, h, w, matrix, Sean)
	search(x+1, y+1, h, w, matrix, Sean)
	search(x-1, y-1, h, w, matrix, Sean)
}

C++: #include <bits/stdc++.h>
using namespace std;

int state[100][100];
bool reached[100][100];
int w,h;

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

void dfs(int x, int y) {

	if(x==0 || w<x || y==0 || h<y || state[x][y] == 0)
		return;
	if(reached[x][y] == true)
		return;

	reached[x][y]=true;

	for(int i=0; i<8; i++) {
		dfs(x+dx[i],y+dy[i]);
	}
}

int main() {

	memset(state, 0, sizeof(state));
	memset(reached, false, sizeof(reached));

	cin >> w >> h;
	for(int i=1; i<=h; i++) {
		for(int j=1; j<=w; j++) {
			cin >> state[i][j];
		}
	}
	int count=0;
	for(int i=1; i<=w; i++) {
		for(int j=1; j<=h; j++) {
			if(reached[i][j]==true || state[i][j] == 0)
				continue;
			else{
				dfs(i,j);
				count++;
			}
		}
	}
	cout << count << endl;
	return 0;
}

C++: #include <cstdio>

using namespace std;

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

void dfs(int x, int y)
{
	field[x][y] = 0;
	
	for(int dx = -1; dx <= 1; dx++){
		for(int dy = -1; dy <= 1; dy++){
			int nx = x + dx;
			int ny = y + dy;
			
			if(0 <= nx && nx < w && 0 <= ny && ny < h && field[nx][ny] == 1) dfs(nx, ny);
		}
	}
	return ;
}

void solve(){
	int res = 0;
	for(int i = 0; i < w; i++){
		for(int j = 0; j < h; j++){
			if(field[i][j] == 1){
				dfs(i, j);
				res++;
			}
		}
	}
	printf("%d\n", res);
}

int main()
{
	while(scanf("%d %d", &w, &h) != EOF){
		if(w == 0 && h == 0){ break; }
		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				scanf("%d", &field[i][j]);
			}
		}
		solve();
	}
	
	return 0;
}

C++: 
using namespace std;

static const int N = 52;

void dfs(int map[][N], int pi, int pj){
	const int di[] = {-1,0,1,1,1,0,-1,-1};
	const int dj[] = {1,1,1,0,-1,-1,-1,0};

	if( map[pi][pj] == 0 ){
		return ;
	}

	map[pi][pj] = 0;

	for(int i = 0; i < sizeof(di)/sizeof(di[0]); i++){
		dfs(map, pi + di[i], pj + dj[i] );
	}
}

int main(void){
	ws(cin);
	while( 1 ){
		int count = 0;
		int n, m;
		int map[N][N] = {{0,},};

		cin >> n >> m;
		if( n == 0 && m == 0 ){
			break;
		}

		for(int i = 0; i < m; i++ ){
			for(int j = 0; j < n; j++){
				cin >> map[j + 1][i + 1];
			}
		}

		for(int i = 0; i < m; i++ ){
			for(int j = 0; j < n; j++){
				if(map[j + 1][i + 1]){
					dfs(map, j + 1, i + 1);
					count++;
				}
			}
		}

		cout << count << "\n";
	}
	return 0;
}

C++: #include<iostream>
using namespace std;
const int MAXW = 51;
const int MAXH = 51;
int map[MAXW][MAXH];
int w,h;
int dx[] = {-1,0,1,-1,1,-1,0,1};
int dy[] = {1,1,1,0,0,-1,-1,-1};
int dfs(int x,int y){
  if(map[x][y] == 0)return 0;
  map[x][y] = 0;
  for(int i = 0;i < 9;i++){
    int nx = x+dx[i];
    int ny = y+dy[i];
    if(nx >= 0 && nx < w & ny >= 0 && ny < h)
      dfs(nx,ny);
  }
  return 1;
}

int main(){
  while(true){
    cin >> w >> h;
    if(w == 0 && h == 0)break;
    for(int i = 0;i < h;i++){
      for(int j = 0;j < w;j++){
        cin >> map[i][j];
      }
    }
    int count = 0;
    for(int i = 0;i < h;i++){
      for(int j = 0;j < w;j++){
        count += dfs(j,i);
      }
    }
    cout << count << endl;
  }
}

C++: #include <iostream>
#include <vector>
#include <algorithm>

typedef long long ll;
using namespace std;

int H, W;
vector<vector<int>> C;
vector<vector<int>> visited;
int ans = 0;





void dfs(int &i, int &j){
    visited[i][j] = 1;
    for(int y=-1; y<=1; y++){
        for(int x=-1; x<=1; x++){
            int ny = i+y;
            int nx = j+x;
            
            if(ny>=0 && ny<H && nx>=0 && nx<W && C[ny][nx] && !visited[ny][nx]) dfs(ny, nx);
        }
    }
    return;
}




int main() {
    while(1){
        ans = 0;
        visited.clear();
        
        cin >> W >> H; if((W&H)==0) break;
        C.resize(H);
        for(vector<int> &v:C) v.resize(W);
        for(vector<int> &row:C)
            for(int &c:row) cin >> c;

        visited.resize(H);
        for(vector<int> &v:visited) v.resize(W);

        for(int i=0; i<H; i++){
            for(int j=0; j<W; j++){
                if(C[i][j] && !visited[i][j]){
                    dfs(i,j);
                    ans ++;
                }
            }
        }
        
        
        cout << ans << endl;
    }
    return 0;
}

C++: #include<bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < n; ++i)
#define rrep(i,n) for(int i = 1; i <= n; ++i)
using namespace std;
//using ll=long long;
const int MX = 2200000;
//const ll LINF = 1000000000000000000ll;
//const long long MOD = 1000000007;
//long long INF = 90000000001000;
int w,h;
bool seen[50][50];
int c[50][50];
int d[2]={1,-1};
void dfs(int i,int j){
    seen[i][j]=true;
    for (int k = 0; k < 2; ++k)
    {
       if (!seen[i+d[k]][j]&&i+d[k]<h&&i+d[k]>=0&&c[i+d[k]][j])dfs(i+d[k],j);
       if (!seen[i][j+d[k]]&&j+d[k]<w&&j+d[k]>=0&&c[i][j+d[k]])dfs(i,j+d[k]);
       if (!seen[i+d[k]][j-d[k]]&&i+d[k]<h&&i+d[k]>=0&&j-d[k]>=0&&j-d[k]<w&&c[i+d[k]][j-d[k]])dfs(i+d[k],j-d[k]);
       if (!seen[i+d[k]][j+d[k]]&&i+d[k]<h&&i+d[k]>=0&&j+d[k]<w&&j+d[k]>=0&&c[i+d[k]][j+d[k]])dfs(i+d[k],j+d[k]); 
    }

}


int main(){


while(1){
cin >> w >> h;
if(w==0&&h==0) break;
for (int i = 0; i < h; ++i)
{
   for (int j = 0; j < w; ++j)
   {
       cin >> c[i][j];
       seen[i][j]=false;
   }
}
int cnt=0;
for (int i = 0; i < h; ++i)
{
  for (int j = 0; j < w; ++j)
  {
    if(c[i][j]==1&&!seen[i][j]){cnt++;dfs(i,j);}
  }
}
cout << cnt << endl;
}

return 0;

}

C++: #include<cstdio>
#include<stack>

using namespace std;

struct Coord {
  int row;
  int col;
};

int solve (int W, int H);
  
int main () {
  int W, H;

  while(1)
    {
      scanf("%d%d", &W, &H);
      if(W==0 && H==0) break;	
      printf("%d\n", solve(W,H));	
    }
}

int solve (int W, int H) {
  int n=0;
  char M[H+2][W+2];
  Coord start;
  for (int i=0; i<=W+1; i++) { M[0][i] = '0'; M[H+1][i] = '0'; }
  for (int i=1; i<=H; i++) { M[i][0] = '0'; M[i][W+1] = '0'; } 
  for (int i=1; i<=H; i++) {
    for (int j=1; j<=W; j++) {
      scanf(" %c", &M[i][j]);
    }
  }
  for(int i=1 ; i<=H ; i++) {
    for(int j=1 ; j<=W ; j++){
      if(M[i][j]=='1'){	
        start.row=i;
        start.col=j;
        M[start.row][start.col]='@';

        stack<Coord> S;
        S.push(start);
        while (!S.empty()) {
          Coord current = S.top(); S.pop();
          int D1[]={1,1,0,-1,-1,-1,0,1}; int D2[]={0,-1,-1,-1,0,1,1,1};
          for (int d=0; d<8; d++) {
            Coord nc = current;
            nc.row += D1[d];
            nc.col += D2[d];
            if(M[nc.row][nc.col]!='0' && M[nc.row][nc.col]!='*' && M[nc.row][nc.col]!='@')
	      {
	        M[nc.row][nc.col] = '*';
	        S.push(nc);
	      }
          } 
        }
        n++;
      }
    }
  }
  return n;
}