#include <algorithm>
#include <array>
#include <assert.h>
#include <chrono>
#include <bitset>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <random>
#include <queue>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef vector<ld> vld;
typedef vector<vector<int>> vvi;
typedef vector<ll> vl;
typedef vector<vector<ll>> vvl;
typedef vector<vector<ld>> vvld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector<pll> vpll;

#ifdef OLBOEB
mt19937 rnd(228 + 1488 + 238 + 24111997 % 322);
#else
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif

void print_time() {
#ifdef OLBOEB
    cout.flush();
    cerr << "\ntime: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
}

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define sz(x) ((ll)(x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

template <typename T>
void update_max(T& x, T y) { x = max(x, y); }
template <typename T>
void update_min(T& x, T y) { x = min(x, y); }

template<class T1, class T2>
ostream& operator<< (ostream &out, pair<T1, T2> pair) { return out << "(" << pair.first << ", " << pair.second << ")";}
template<class T> ostream& operator<<(ostream& out, vector<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class T> ostream& operator<<(ostream& out, set<T> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }
template<class L, class R> ostream& operator<<(ostream& out, map<L, R> vec) { out<<"("; for (auto& v: vec) out<<v<<", "; return out<<")"; }






int main() {
    cout << fixed << setprecision(20);
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    ll h, w, k;
    cin >> h >> w >> k;

    vs pole(h, string(w, '0'));
    vvl ans(h, vl(w, -1));

    for (ll i = 0; i < h; ++i) {
        cin >> pole[i];
    }

    vl cnt_by_x(h);
    for (ll x = 0; x < h; ++x) {
        for (ll y = 0; y < w; ++y) {
            if (pole[x][y] == '#') {
                ++cnt_by_x[x];
            }
        }
    }

    ll start_x = 0;
    while (!cnt_by_x[start_x]) { ++start_x; }
    ll lx = 0;
    ll rx = 0;
    set<ll> ys;
    ll c = 1;
    for (ll x = start_x; x < h; ++x) {
        if (cnt_by_x[x]) {
            ys.clear();
            for (ll y = 0; y < w; ++y) {
                if (pole[x][y] == '#') ys.insert(y);
            }
        }
        rx = x + 1;
        while (rx < h && cnt_by_x[rx] == 0) ++rx;

        for (ll yy = 0; yy < w; ++yy) {
            for (ll xx = lx; xx < rx; ++xx) {
                ans[xx][yy] = c;
            }
            if (ys.count(yy) && yy != *ys.rbegin()) ++c;
        }
        ++c;

        lx = rx;
        rx = lx;
        x = rx - 1;
    }

    for (ll x = 0; x < h; ++x) {
        for (ll a : ans[x]) { cout << a << " "; }
        cout << "\n";
    }


    print_time();
    return 0;
}


Measured memory_bytes: 1664