#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a)  (a).begin(),(a).end()

template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }

typedef long long ll;

void print(const int &H,const int &W,const vector<vector<char>> &M) {
    REP(i,H) {
        REP(j,W) cout << M[i][j];
        cout << endl;
    }
}

void print(const int &H,const int &W,vector<vector<int>> M) {
    REP(i,H) {
        REP(j,W) cout << M[i][j] << " ";
        cout << endl;
    }
}
// TODO: 一番上の行にイチゴがない場合の処理をかく
int main() {
    int H,W,K;
    cin >> H >> W >> K;
    int sH=H;
    int sW=W;
    vector<vector<char>> M(H,vector<char>(W));
    vector<vector<int>> C(H,vector<int>(W,-1));
    bool isTop = true;
    int eject=0;

    REP(i,H) {
        string str;
        cin >> str;
        if (isTop && str==string(W,'.')) {
            eject++;
        }
        else isTop = false;
        vector<char> v(ALL(str));
        M[i]=v;
    }
    // 一番上の行がイチゴなしの行なら取り除く
    // cout << "eject count " << eject << endl;
    int e = eject;
    while (e>0) {
        M.erase(M.begin());
        C.erase(C.begin());
        e--;
        H--;
    }

    int color = 1;
    // 探索の開始
    REP(i,H) {

        REP(j,W) {

            // #マスなら新規カラー
            if (M[i][j]=='#') {
                C[i][j]=color;
                // 次の#マスが出るまで同カラーで埋める
                FOR(j2,j+1,W) {
                    if (M[i][j2]!='#') {
                        // cout << "inject: " << color << "i j2" << i << " " << j2 << endl;

                        C[i][j2]=color;
                    }
                    else break;
                }

                color++;

                continue;
            }
            // 探索済み
            if (C[i][j]!=-1) continue;

            // .マスならまずは右に探索。
            // 見ているマスが右端でないなら
            if (j<(W-1)) {
                bool exsits = false;
                pair<int,int> sharpPos;
                FOR(j2,j,W) {
                    if (M[i][j2]=='#') {
                        exsits = true;
                        sharpPos = make_pair(i,j2);
                        break;
                    }
                }
                if (exsits) {
                    if (C[sharpPos.first][sharpPos.second]==-1) {
                        C[i][j]=color;
                        C[sharpPos.first][sharpPos.second]=color;
                    }
                    else C[i][j]=C[sharpPos.first][sharpPos.second];
                    // その行に#があったら上への探索は行わない
                    continue;
                }
            }
            // 上への探索。
            if (i>0) {
                int i2= i-1;
                while(i2>=0) {
                    bool exsists = false;
                    pair<int,int> sharpPos;
                    FOR(j2,j,W) {
                        if (M[i2][j2]=='#') {
                            exsists = true;
                            sharpPos = make_pair(i2,j2);
                            break;
                        }
                    }
                    if (exsists) {
                        if (C[sharpPos.first][sharpPos.second]==-1) {
                            cout << "Error" << endl;
                            return 1;
                        }
                        C[i][j]=C[sharpPos.first][sharpPos.second];
                        // その行に#があったらさらに上への探索は行わない
                        break;
                    }
                    i2-=1;
                }
            }
            // それでも見つからないなら上へマージ
            C[i][j]=C[i-1][j];

        }
    }
    // print(H,W,M);
    // print(H,W,C);
    // Merge
    if (eject!=0) {
        H+=eject;
        auto front = C.front();
        auto mfront = vector<char>(W,'.');
        REP(i,eject) {
            auto it = C.begin();
            auto mit = M.begin();
            C.insert(it,front);
            M.insert(mit,mfront);
        }
    }
    // クソ
    REP(i,H) {
        string s(M[i].begin(),M[i].end());
        auto s2 = string(W,'.');
        if (s==s2) {
            // cout << i << endl;
            // cout << s << endl;
            REP(j,W) {
                if (i+1 < H) {
                    C[i][j]=C[i+1][j];
                }
                else {
                    C[i][j]=C[i-1][j];

                }
            }
        }
    }
    print(H,W,C);

    REP(i,H) {
        REP(j,W) {
            if (C[i][j]==-1) throw "GG";
        }
    }
    if (sH != H || sW != W) throw "GG";
    if (C[H-1][W-1]!=K) throw "GG";


    ////////////////////
    // Write your code.
    ////////////////////

    return 0;
}


Measured memory_bytes: 1536