package main
import (
"fmt"
"sort"
)
type Cell struct {
r, c int
}
func main() {
var n, m, k int
if _, err := fmt.Scan(&n, &m, &k); err != nil {
return
}
grid := make([][]byte, n)
for i := 0; i < n; i++ {
var s string
fmt.Scan(&s)
grid[i] = []byte(s)
}
visited := make([][]bool, n)
for i := 0; i < n; i++ {
visited[i] = make([]bool, m)
}
var lakes [][]Cell
dr := []int{-1, 1, 0, 0}
dc := []int{0, 0, -1, 1}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == '.' && !visited[i][j] {
var comp []Cell
q := []Cell{{i, j}}
visited[i][j] = true
isLake := true
for head := 0; head < len(q); head++ {
curr := q[head]
comp = append(comp, curr)
if curr.r == 0 || curr.r == n-1 || curr.c == 0 || curr.c == m-1 {
isLake = false
}
for d := 0; d < 4; d++ {
nr := curr.r + dr[d]
nc := curr.c + dc[d]
if nr >= 0 && nr < n && nc >= 0 && nc < m {
if grid[nr][nc] == '.' && !visited[nr][nc] {
visited[nr][nc] = true
q = append(q, Cell{nr, nc})
}
}
}
}
if isLake {
lakes = append(lakes, comp)
}
}
}
}
sort.Slice(lakes, func(i, j int) bool {
return len(lakes[i]) < len(lakes[j])
})
filled := 0
for i := 0; i < len(lakes)-k; i++ {
filled += len(lakes[i])
for _, c := range lakes[i] {
grid[c.r][c.c] = '*'
}
}
fmt.Println(filled)
for i := 0; i < n; i++ {
fmt.Println(string(grid[i]))
}
}