← Home
package main

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

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

	var n, m int
	if _, err := fmt.Fscanf(reader, "%d %d\n", &n, &m); err != nil {
		return
	}

	grid := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Fscanf(reader, "%s\n", &grid[i])
	}

	type Cell struct{ r, c int }
	adj := make(map[Cell][]Cell)

	dirs := []Cell{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == 'X' {
				var unmarked []Cell
				for _, d := range dirs {
					nr, nc := r+d.r, c+d.c
					if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] == '.' {
						unmarked = append(unmarked, Cell{nr, nc})
					}
				}
				if len(unmarked) == 1 || len(unmarked) == 3 {
					fmt.Fprintln(writer, "NO")
					return
				}
				if len(unmarked) == 2 {
					u, v := unmarked[0], unmarked[1]
					adj[u] = append(adj[u], v)
					adj[v] = append(adj[v], u)
				} else if len(unmarked) == 4 {
					top := Cell{r - 1, c}
					bottom := Cell{r + 1, c}
					left := Cell{r, c - 1}
					right := Cell{r, c + 1}
					adj[top] = append(adj[top], left)
					adj[left] = append(adj[left], top)
					adj[bottom] = append(adj[bottom], right)
					adj[right] = append(adj[right], bottom)
				}
			}
		}
	}

	color := make(map[Cell]int)
	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == '.' {
				color[Cell{r, c}] = -1
			}
		}
	}

	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			start := Cell{r, c}
			if grid[r][c] == '.' && color[start] == -1 {
				color[start] = 0
				queue := []Cell{start}
				for len(queue) > 0 {
					u := queue[0]
					queue = queue[1:]
					for _, v := range adj[u] {
						if color[v] == -1 {
							color[v] = 1 - color[u]
							queue = append(queue, v)
						} else if color[v] == color[u] {
							fmt.Fprintln(writer, "NO")
							return
						}
					}
				}
			}
		}
	}

	ans := make([][]int, n)
	for i := range ans {
		ans[i] = make([]int, m)
	}

	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == '.' {
				if color[Cell{r, c}] == 0 {
					ans[r][c] = 1
				} else {
					ans[r][c] = 4
				}
			}
		}
	}

	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == 'X' {
				sum := 0
				for _, d := range dirs {
					nr, nc := r+d.r, c+d.c
					if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] == '.' {
						sum += ans[nr][nc]
					}
				}
				ans[r][c] = sum
			}
		}
	}

	fmt.Fprintln(writer, "YES")
	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if c > 0 {
				fmt.Fprint(writer, " ")
			}
			fmt.Fprint(writer, ans[r][c])
		}
		fmt.Fprintln(writer)
	}
}