Go: package main

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

var (
	readString func() string
	readBytes  func() []byte
	stdout     *bufio.Writer
)

func init() {
	readString, readBytes = newReadString(os.Stdin)
	stdout = bufio.NewWriter(os.Stdout)
}

func newReadString(ior io.Reader) (func() string, func() []byte) {
	r := bufio.NewScanner(ior)
	r.Buffer(make([]byte, 1024), math.MaxInt32)
	r.Split(bufio.ScanWords)

	f1 := func() string {
		if !r.Scan() {
			panic("Scan failed")
		}
		return r.Text()
	}
	f2 := func() []byte {
		return []byte(f1())
	}
	return f1, f2
}

func readInt() int {
	return int(readInt64())
}

func readInt64() int64 {
	i, err := strconv.ParseInt(readString(), 10, 64)
	if err != nil {
		panic(err.Error())
	}
	return i
}

func readFloat64() float64 {
	f, err := strconv.ParseFloat(readString(), 64)
	if err != nil {
		panic(err.Error())
	}
	return f
}

func printf(f string, args ...interface{}) (int, error) {
	return fmt.Fprintf(stdout, f, args...)
}

func println(args ...interface{}) (int, error) {
	return fmt.Fprintln(stdout, args...)
}

func eprintln(args ...interface{}) (int, error) {
	return fmt.Fprintln(os.Stderr, args...)
}

func eprintf(f string, args ...interface{}) (int, error) {
	return fmt.Fprintf(os.Stderr, f, args...)
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func min64(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a < b {
		return b
	}
	return a
}

func max64(a, b int64) int64 {
	if a < b {
		return b
	}
	return a
}

func abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}

func abs64(a int64) int64 {
	if a < 0 {
		return -a
	}
	return a
}

func gcd(a, b int) int {
	if b == 0 {
		return a
	}
	return gcd(b, a%b)
}

func gcd64(a, b int64) int64 {
	if b == 0 {
		return a
	}
	return gcd64(b, a%b)
}

// readString() string
// readInt() int
// readInt64() int64
// readFloat64() float64

// -----------------------------------------------------------------------------

func main() {
	defer stdout.Flush()

	for {
		ans, ok := solve()
		if !ok {
			break
		}
		println(ans)
	}

}

func solve() (int, bool) {
	w := readInt()
	h := readInt()
	if w == 0 && h == 0 {
		return 0, false
	}

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

	var ans int
	for i := 1; i-1 < h; i++ {
		for j := 1; j-1 < w; j++ {
			if 0 < c[i][j] {
				ans++
				dfs(c, i, j)
			}
		}
	}
	return ans, true
}

func dfs(c [][]int, y, x int) {
	c[y][x] = 0
	dx := []int{-1, 0, 1, -1, 1, -1, 0, 1}
	dy := []int{-1, -1, -1, 0, 0, 1, 1, 1}
	for i := range dx {
		nx := x + dx[i]
		ny := y + dy[i]
		if 0 < c[ny][nx] {
			dfs(c, ny, nx)
		}
	}
}

// -----------------------------------------------------------------------------

Python: import sys
sys.setrecursionlimit(10 ** 6)

def dfs(here_w, here_h):
    if 0 <= here_w < width and 0 <= here_h < height:
        if target[here_h][here_w]:
            target[here_h][here_w] = 0
            for x, y in all_move:
                dfs(here_w + x, here_h + y)
                
all_move = [[1, 1], [1, 0], [1, -1], [0, 1], [0, -1], [-1, 1], [-1, 0], [-1, -1]]
while True:
    width, height = map(int, input().split(" "))
    if not width:
        break
    target = []
    for h in range(height):
        temp = [int(n) for n in input().split(" ")]
        target.append(temp)
    # print(width, height, temp)
    answer = 0
    for h in range(height):
        for w in range(width):
            if target[h][w]:
                answer += 1
                dfs(w, h)
    print(answer)

Python: UNSEARCHED = 0
SEARCHED = -1
LAND = 1
SEA = 0
result = []

while(True):
    str = input().split(" ")
    w = int(str[0])
    h = int(str[1])
    if w == 0 and h == 0:
        break
    area = [[0 for i in range(w)] for i in range(h)]
    status = [[UNSEARCHED for i in range(w)] for i in range(h)]
    index = 0
    
    for i in range(h):
        str = input().split(" ")
        area[i] = [int(str[l]) for l in range(w)]
    
    for i in range(h):
        for l in range(w):
            if status[i][l] == UNSEARCHED and area[i][l] == LAND:
                index += 1
                status[i][l] = index
    
                # (y,x)
                stack = [(i+1, l), (i-1, l), (i, l+1), (i, l-1), (i+1, l+1), (i+1, l-1), (i-1, l-1), (i-1, l+1)]
                while(len(stack) > 0):
                    s = stack.pop(0)
                    
                    if not (0 <= s[0] < h and 0 <= s[1] < w):
                        continue
    
                    if status[s[0]][s[1]] == UNSEARCHED and area[s[0]][s[1]] == LAND :
                        status[s[0]][s[1]] = index
                        stack.append((s[0], s[1]))
                        stack.append((s[0], s[1]+1))
                        stack.append((s[0], s[1]-1))
                        stack.append((s[0]+1, s[1]))
                        stack.append((s[0]-1, s[1]))
                        stack.append((s[0]+1, s[1]+1))
                        stack.append((s[0]+1, s[1]-1))
                        stack.append((s[0]-1, s[1]+1))
                        stack.append((s[0]-1, s[1]-1))
                    elif area[s[0]][s[1]] == SEA:
                        status[s[0]][s[1]] = SEARCHED
    
            elif status[i][l] == UNSEARCHED:
                status[i][l] = SEARCHED
    
    result.append(index)

for i in result:
    print(i)

Python: # -*- coding: utf-8 -*-


def search(n, m, tile, N, M):
    for dy, dx in zip([-1, -1, -1, 0, 0, 1, 1, 1], [-1, 0, 1, -1, 1, -1, 0, 1]):
        if 0 <= dy + n < N and 0 <= dx + m < M:
            if tile[dy + n][dx + m] == '1':
                tile[dy + n][dx + m] = '2'
                search(dy + n, dx + m, tile, N, M)


while True:
    M, N = map(int, input().split())
    if M == 0 and N == 0:
        break
    tile = [input().split() for n in range(N)]
    ans = 0
    for n in range(N):
        for m in range(M):
            if tile[n][m] == '1':
                tile[n][m] = '2'
                search(n, m, tile, N, M)
                ans += 1
    print(ans)

Python: import sys
def dfs(tiles, W, H, x, y):
    tiles[y][x] = '0'
    for dx,dy in ((-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)):
        if 0<=x+dx<W and 0<=y+dy<H and tiles[y+dy][x+dx]=='1':
            dfs(tiles, W, H, x+dx, y+dy)
    return

def main():
    while True:
        W,H = [int(x) for x in input().split()]
        if W==0 and H==0:
            exit()
        tiles = [input().split() for h in range(H)]
        cnt = 0
        for h in range(H):
            for w in range(W):
                if tiles[h][w] == '1':
                    cnt += 1
                    dfs(tiles, W, H, w, h)
        print(cnt)

if __name__ == '__main__':
    sys.setrecursionlimit(10000)
    main()