← Home
```go
package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, m int
	fmt.Fscan(in, &n, &m)

	grid := make([][]byte, n)
	for i := 0; i < n; i++ {
		var s string
		fmt.Fscan(in, &s)
		grid[i] = []byte(s)
	}

	compID := make([][]int, n)
	for i := 0; i < n; i++ {
		compID[i] = make([]int, m)
	}

	compSize := make([]int, 1)
	currID := 0
	dr := []int{0, 0, 1, -1}
	dc := []int{1, -1, 0, 0}
	type pt struct{ r, c int }

	// BFS to find connected components and calculate their sizes
	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == '.' && compID[r][c] == 0 {
				currID++
				compID[r][c] = currID
				q := []pt{{r, c}}
				size := 0
				for i := 0; i < len(q); i++ {
					cur := q[i]
					size++
					for k := 0; k < 4; k++ {
						nr, nc := cur.r+dr[k], cur.c+dc[k]
						if nr >= 0 && nr < n && nc >= 0 && nc < m {
							if grid[nr][nc] == '.' && compID[nr][nc] == 0 {
								compID[nr][nc] = currID
								q = append(q, pt{nr, nc})
							}
						}
					}
				}
				compSize = append(compSize, size)
			}
		}
	}

	// Calculate and print answer for each cell
	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == '.' {
				out.WriteByte('.')
			} else {
				sum := 1
				var seen [4]int
				cnt := 0
				for k := 0; k < 4; k++ {
					nr, nc := r+dr[k], c+dc[k]
					if nr >= 0 && nr < n && nc >= 0 && nc < m {
						if grid[nr][nc] == '.' {
							id := compID[nr][nc]
							found := false
							for x := 0; x < cnt; x++ {
								if seen[x] == id {
									found = true
									break
								}
							}
							if !found {
								sum += compSize[id]
								seen[cnt] = id
								cnt++
							}
						}
					}
				}
				out.WriteByte(byte('0' + sum%10))
			}
		}
		out.WriteByte('\n')
	}
}
```