//By TheOneYouWant
#pragma GCC optimize ("-O2")
#include <bits/stdc++.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define memreset(a) memset(a,0,sizeof(a))
#define testcase(t) int t;cin>>t;while(t--)
#define forstl(i,v) for(auto &i: v)
#define forn(i,e) for(int i=0;i<e;++i)
#define forsn(i,s,e) for(int i=s;i<e;++i)
#define rforn(i,s) for(int i=s;i>=0;--i)
#define rforsn(i,s,e) for(int i=s;i>=e;--i)
#define bitcount(a) __builtin_popcount(a) // set bits (add ll)
#define ln '\n'
#define getcurrtime() cerr<<"Time = "<<((double)clock()/CLOCKS_PER_SEC)<<endl
#define dbgarr(v,s,e) cerr<<#v<<" = "; forsn(i,s,e) cerr<<v[i]<<", "; cerr<<endl
#define inputfile freopen("input.txt", "r", stdin)
#define outputfile freopen("output.txt", "w", stdout)
#define dbg(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); \
stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) { cerr<<endl; }
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
	cerr << *it << " = " << a << "\t"; err(++it, args...);
}
template<typename T1,typename T2>
ostream& operator <<(ostream& c,pair<T1,T2> &v){
	c<<"("<<v.fi<<","<<v.se<<")"; return c;
}
template <template <class...> class TT, class ...T>
ostream& operator<<(ostream& out,TT<T...>& c){
    out<<"{ ";
    forstl(x,c) out<<x<<" ";
    out<<"}"; return out;
}
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll,ll> p64;
typedef pair<int,int> p32;
typedef pair<int,p32> p96;
typedef vector<ll> v64;
typedef vector<int> v32; 
typedef vector<v32> vv32;
typedef vector<v64> vv64;
typedef vector<p32> vp32;
typedef vector<p64> vp64;
typedef vector<vp32> vvp32;
typedef map<int,int> m32;
const int LIM=1e5+5,MOD=1e9+7;
const ld EPS = 1e-9;


int main(){
	fastio;

	int h,w,k;
	cin>>h>>w>>k;

	int tiling[h][w];
	forn(i,h){
		forn(j,w) tiling[i][j] = -1;
	}
	int grid[h][w];
	forn(i,h){
		forn(j,w){
			char c;
			cin>>c;
			if(c == '#') grid[i][j] = 1;
			else grid[i][j] = 0;
		}
	}

	int cnt = 1;

	forn(i,h){
		forn(j,w){
			if(grid[i][j]!=1) continue;
			int leftb = j, rightb = j;
			int highb = i, lowb = i;

			int ptr = j-1;
			while(ptr>=0){
				if(grid[i][ptr]==1) break;
				if(tiling[i][ptr]!=-1) break;
				leftb = ptr;
				ptr--;
			}	
			ptr = j+1;
			while(ptr<=w-1){
				if(grid[i][ptr]==1) break;
				if(tiling[i][ptr]!=-1) break;
				rightb = ptr;
				ptr++;
			}

			forsn(m,leftb,rightb+1){
				tiling[i][m] = cnt;
			}
			ptr = i-1;
			while(ptr>=0){
				bool p = 1;
				forsn(v,leftb,rightb+1){
					if(tiling[ptr][v]!=-1 || grid[ptr][v]==1) p=0;
				}
				if(!p) break;
				forsn(v,leftb,rightb+1){
					tiling[ptr][v] = cnt;
				}
				lowb = ptr;
				ptr--;
			}
			ptr = i+1;
			while(ptr<=h-1){
				bool p = 1;
				forsn(v,leftb,rightb+1){
					if(tiling[ptr][v]!=-1 || grid[ptr][v]==1) p=0;
				}
				if(!p) break;
				forsn(v,leftb,rightb+1){
					tiling[ptr][v] = cnt;
				}
				highb = ptr;
				ptr++;
			}

			cnt++;

			// cout<<i<<" "<<j<<" "<<lowb<<" "<<highb<<" "<<leftb<<" "<<rightb<<ln;
		}
	}

	forn(i,h){
		forn(j,w){
			cout<<tiling[i][j]<<" ";
		}
		cout<<ln;
	}


	return 0;
}

Measured memory_bytes: 1536