# -*- coding: utf-8 -*-
import sys
import math
from bisect import bisect_left
from bisect import bisect_right
import collections
import copy
import heapq
from collections import defaultdict
from heapq import heappop, heappush
import itertools
input = sys.stdin.readline

##### リストの 二分木検索 #####
# bisect_left(lists, 3)
# bisect_right(lists, 3)

##### プライオリティキュー #####
# heapq.heapify(a) #リストaのheap化
# heapq.heappush(a,x) #heap化されたリストaに要素xを追加
# heapq.heappop(a) #heap化されたリストaから最小値を削除＆その最小値を出力

# heapq.heappush(a, -x) #最大値を取り出す時は、pushする時にマイナスにして入れよう
# heapq.heappop(a) * (-1) #取り出す時は、-1を掛けて取り出すこと

##### タプルリストのソート #####
# sorted(ans) #(a, b) -> 1st : aの昇順, 2nd : bの昇順
# sorted(SP, key=lambda x:(x[0],-x[1])) #(a, b) -> 1st : aの昇順, 2nd : bの降順
# sorted(SP, key=lambda x:(-x[0],x[1])) #(a, b) -> 1st : aの降順, 2nd : bの昇順
# sorted(SP, key=lambda x:(-x[0],-x[1])) #(a, b) -> 1st : aの降順, 2nd : bの降順

# sorted(SP, key=lambda x:(x[1])) #(a, b) -> 1st : bの昇順
# sorted(SP, key=lambda x:(-x[1])) #(a, b) -> 1st : bの降順

def inputInt(): return int(input())
def inputMap(): return map(int, input().split())
def inputList(): return list(map(int, input().split()))

def main():
	H,W,K = inputMap()
	S = []
	for i in range(H):
		s = input()
		s = list(s)
		s = s[:-1]
		S.append(s)

	cnt = 1
	ans = []
	for i,val in enumerate(S):
		tmp = []
		flg1 = False
		flg2 = False
		for j,vol in enumerate(val):
			if vol == "#":
				flg2 = True

				if flg1 == False:
					flg1 = True
					tmp.append(cnt)
				else:
					flg1 = False
					cnt += 1
					tmp.append(cnt)
			else:
				tmp.append(cnt)

		if flg2 == False:
			ans.append(ans[-1])
		else:
			cnt += 1
			ans.append(tmp)

	for i in ans:
		print(*i)


if __name__ == "__main__":
	main()


### FIXED CODE ###

# -*- coding: utf-8 -*-
import sys
import math
from bisect import bisect_left
from bisect import bisect_right
import collections
import copy
import heapq
from collections import defaultdict
from heapq import heappop, heappush
import itertools
input = sys.stdin.readline

##### リストの 二分木検索 #####
# bisect_left(lists, 3)
# bisect_right(lists, 3)

##### プライオリティキュー #####
# heapq.heapify(a) #リストaのheap化
# heapq.heappush(a,x) #heap化されたリストaに要素xを追加
# heapq.heappop(a) #heap化されたリストaから最小値を削除＆その最小値を出力

# heapq.heappush(a, -x) #最大値を取り出す時は、pushする時にマイナスにして入れよう
# heapq.heappop(a) * (-1) #取り出す時は、-1を掛けて取り出すこと

##### タプルリストのソート #####
# sorted(ans) #(a, b) -> 1st : aの昇順, 2nd : bの昇順
# sorted(SP, key=lambda x:(x[0],-x[1])) #(a, b) -> 1st : aの昇順, 2nd : bの降順
# sorted(SP, key=lambda x:(-x[0],x[1])) #(a, b) -> 1st : aの降順, 2nd : bの昇順
# sorted(SP, key=lambda x:(-x[0],-x[1])) #(a, b) -> 1st : aの降順, 2nd : bの降順

# sorted(SP, key=lambda x:(x[1])) #(a, b) -> 1st : bの昇順
# sorted(SP, key=lambda x:(-x[1])) #(a, b) -> 1st : bの降順

def inputInt(): return int(input())
def inputMap(): return map(int, input().split())
def inputList(): return list(map(int, input().split()))

def main():
	H,W,K = inputMap()
	S = []
	for i in range(H):
		s = input()
		s = list(s)
		s = s[:-1]
		S.append(s)

	cnt = 1
	ans = []
	cpy = 0
	for i,val in enumerate(S):
		tmp = []
		flg1 = False
		flg2 = False

		flg3 = False

		for j,vol in enumerate(val):
			if vol == "#":
				flg2 = True

				if flg1 == False:
					flg1 = True
					tmp.append(cnt)
				else:
					if flg3 == False:
						flg3 = True
						cnt += 1
						tmp.append(cnt)
					else:
						flg3 = False
						cnt += 1
						tmp.append(cnt)
			else:
				tmp.append(cnt)

		#print(flg2)
		if flg2 == False:
			if len(ans) > 0:
				ans.append(ans[-1])
			else:
				cpy += 1
		else:
			ans.append(tmp)
			#print(cpy)
			for i in range(cpy):
				#print("dddd")
				ans.append(tmp)
			cpy = 0
			cnt += 1

	for i in ans:
		print(*i)


if __name__ == "__main__":
	main()