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<iostream>
using namespace std;
int box[51][51];
int main(){
  int w,h,i,I,a;
  while(1){
    a=0;
    cin>>w>>h;
    if(w==0&&h==0) break;
    for(i=0;i<=h+1;i++){
      for(I=0;I<=w+1;I++){
	box[i][I]==0;
      }
    }
    for(i=1;i<=h;i++){
      for(I=1;I<=w;I++){
	cin>>box[i][I];
      }
    }
    for(i=1;i<=h;i++){
      for(I=1;I<=w;I++){
	if(box[i][I]==1){
	  kazu(i,I);
	  a++;
	}
      }
    }
    cout<<a<<endl;
  }
  return 0;
}
  void kazu(int i,int I){
    if(box[i][I+1]==1) {
      box[i][I+1]=0;
      kazu(i,I+1);
    }
    if(box[i][I-1]==1) {
      box[i][I-1]=0;
      kazu(i,I-1);
    }
    if(box[i+1][I]==1) {
      box[i+1][I]=0;
      kazu(i+1,I);
    }
    if(box[i+1][I+1]==1) {
      box[i+1][I+1]=0;
      kazu(i+1,I+1);
    }
    if(box[i+1][I-1]==1) {
      box[i+1][I-1]=0;
      kazu(i+1,I-1);
    }
    if(box[i-1][I+1]==1) {
      box[i-1][I+1]=0;
      kazu(i-1,I+1);
    }
    if(box[i-1][I-1]==1) {
      box[i-1][I+1]=0;
      kazu(i-1,I+1);
    }
    if(box[i-1][I]==1) {
      box[i-1][I]=0;
      kazu(i-1,I);
    }

  }

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

using namespace std;


vector<vector<bool>> seen;
vector<int> dx;
vector<int> dy;

void dfs(int u,int v,vector<vector<int>> &c){

    seen[u][v]=true;

    for(int i=0;i<8;i++){
        if(c[u+dx[i]][v+dy[i]]==0)continue;
        if(seen[u+dx[i]][v+dy[i]])continue;
        dfs(u+dx[i],v+dy[i],c);
    }

}

int main(){

    dx={-1,0,1,-1,1,-1,0,1};
    dy={1,1,1,0,0,-1,-1,-1};

    int w=1,h=1;
    cin >> w >> h;
    while(true){
        if(h==0 && w==0)break;
        else{
            vector<vector<int>> c(h+2);
            for(int i=0;i<h+2;i++)c[i].resize(w+2);

            for(int i=0;i<w+2;i++)c[0][i]=0;

            for(int i=1;i<h+1;i++){
                c[i][0]=0;
                for(int j=0;j<w;j++){
                    cin >> c[i][j+1];
                }   
                c[i][w+1]=0;
            }
            for(int i=0;i<w+2;i++)c[h+1][i]=0;
            seen.resize(h+2);
            for(int i=0;i<h+2;i++)seen[i].assign(w+2,false);            

            int e=0;

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

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

using std::cin;
using std::cout;
using std::endl;

int main(void) {
	int w,h;
	cin >> w;
	cin >> h;

	while (w!=0||h!=0) {
		int count = 0;
		std::stack<int> st_x,st_y;
		int xn,yn;
		int c;
		bool all = false;
		std::vector< std::vector<bool> > island(h+2, std::vector<bool>(w+2));
		for (int i = 0; i < h+2; i++) {
			for (int j = 0; j < w+2; j++) {
				if (i==0||i==h+1||j==0||j==w+1) {
					island[i][j] = false;
				} else {
					cin >> c;
					if (c==1) {
						island[i][j] = true;
					} else {
						island[i][j] = false;
					}
				}
			}
		}

		while (!all) {
			all = true;
			for (int i = 1; i < h+1; i++) {
				for (int j = 1; j < w+1; j++) {
					if (island[i][j]) {
						xn = i;
						yn = j;
						all = false;
					}
				}
			}
			if (!all) {
				st_x.push(xn);
				st_y.push(yn);
				if (island[xn][yn]) {
					island[xn][yn] = false;
					count++;

					while (!st_x.empty()) {
						xn = st_x.top();
						yn = st_y.top();
						st_x.pop();
						st_y.pop();
						if (island[xn+1][yn]) {
							st_x.push(xn+1);
							st_y.push(yn);
							island[xn+1][yn] = false;
						}
						if (island[xn-1][yn]) {
							st_x.push(xn-1);
							st_y.push(yn);
							island[xn-1][yn] = false;
						}
						if (island[xn+1][yn+1]) {
							st_x.push(xn+1);
							st_y.push(yn+1);
							island[xn+1][yn+1] = false;
						}
						if (island[xn+1][yn-1]) {
							st_x.push(xn+1);
							st_y.push(yn-1);
							island[xn+1][yn-1] = false;
						}
						if (island[xn-1][yn+1]) {
							st_x.push(xn-1);
							st_y.push(yn+1);
							island[xn-1][yn+1] = false;
						}
						if (island[xn-1][yn-1]) {
							st_x.push(xn-1);
							st_y.push(yn-1);
							island[xn-1][yn-1] = false;
						}
						if (island[xn][yn+1]) {
							st_x.push(xn);
							st_y.push(yn+1);
							island[xn][yn+1] = false;
						}
						if (island[xn][yn-1]) {
							st_x.push(xn);
							st_y.push(yn-1);
							island[xn][yn-1] = false;
						}
					}
				}
			}
		}
		cout << count << endl;

		cin >> w;
		cin >> h;
	}	
		return 0;
}

C++: #include <bits/stdc++.h>
#define int long long
#define double long double
#define INF 1e18
using namespace std;

int W, H;
int c[1000][1000];

void dfs(int x, int y) {
  int moveX[3] = {0,-1,1};
  int moveY[3] = {0,-1,1};
  c[x][y] = 0;
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
      int nx=x+moveX[i], ny=y+moveY[j];
      if(nx<0||ny<0) continue;
      if(c[nx][ny] == 1) dfs(nx,ny);
    }
  }
}

signed main() {
  cin>>W>>H;
  while (W+H!=0) {
    // i = y, j = x
    for(int i=0;i<1000;i++)for(int j=0;j<1000;j++)c[i][j]=0;
    for(int i=0;i<H;i++){
      for(int j= 0;j<W;j++){
        cin>>c[i][j];
      }
    }
    
    int ans = 0;
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (c[i][j] == 1) {
          dfs(i, j);
          ans++;
        }
      }
    }
    cout << ans << endl;
    cin >> W >> H;
  }
}

C++: #include <iostream>
#include <iomanip>
#include <sstream>
#include <vector>
#include <array>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <numeric>
#include <utility>
#include <cstdlib>
#include <ctime>
#include <cstdint>
#include <cmath>

#define FOR(i,k,n)  for(int i = (k);i < (n);++i)
#define REP(i,n)    FOR(i,0,n)
#define EACH(i,x)   for(auto & i : x)
#define ALL(x)      begin(x),end(x)

using namespace std;

typedef vector<int> vecint;

int root(int i,vecint& p){
  if(p[i] != i+1)
    p[i] = root(p[i]-1,p);
  return p[i];
}
void join(int i,int j,vecint& p){
  p[root(i,p)-1] = root(j,p);
}

int main()
{
  while(true){
    int w,h;cin>>w>>h;
    if(!(w||h))break;
    vector<vecint> m(h+2,vecint(w+2));
    REP(i,h)REP(j,w)cin>>m[i+1][j+1];
    int n=(w+2)*(h+2);
    vecint p(n);
    REP(i,n)p[i]=i+1;
    REP(i,h)REP(j,w){
      int di[8] = {1,1,1,0,-1,-1,-1,0};
      int dj[8] = {1,0,-1,-1,-1,0,1,1};
      REP(k,8){
        int ni=i+di[k];
        int nj=j+dj[k];
        if (m[i+1][j+1] && m[ni+1][nj+1]){
          int ijn = (i+1)*(w+2)+(j+1);
          int nijn = (ni+1)*(w+2)+(nj+1);
          join(ijn,nijn,p);
        }
      }
    }
    set<int> s;
    REP(i,h)REP(j,w){
      if(m[i+1][j+1]){
        int ijn = (i+1)*(w+2)+(j+1);
        s.insert(root(ijn,p));
      }
    }
    cout<<s.size()<<endl;
  }
  return 0;
}