// 深さ優先探索
#include <bits/stdc++.h>
using namespace std;
#define int long long
using P = pair<int, int>;
constexpr array<int, 4> dx = {1, 0, -1, 0};
constexpr array<int, 4> dy = {0, 1, 0, -1};
constexpr int INF = 1010101010;
constexpr int MOD = 1000000000 + 7;
// constexpr int MOD = 998244353;
template <class T>
bool chmax(T &a, const T &b)
{
    if (a < b)
    {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
bool chmin(T &a, const T &b)
{
    if (b < a)
    {
        a = b;
        return 1;
    }
    return 0;
}
constexpr int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
constexpr int fact(int n) { return n > 1 ? n * fact(n - 1) % MOD : 1; }
int modinv(int a)
{
    int b = MOD, u = 1, v = 0;
    while (b)
    {
        int t = a / b;
        a -= t * b;
        swap(a, b);
        u -= t * v;
        swap(u, v);
    }
    u %= MOD;
    if (u < 0)
        u += MOD;
    return u;
}
constexpr int modpow(int a, int n)
{
    int rtn = 1;
    while (n > 0)
    {
        if (n & 1)
            rtn = rtn * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return rtn;
}

constexpr char BERRY = '#';
// 升目マップを探索する
class Cake
{
private:
    vector<vector<int>> _map;
    int _h, _w;
    int _berry{0};
    vector<int> cutting_row; // i行とi-1行の間を切る
    bool cutCake(int h0, int h1, int w0, int w1, int owner);

public:
    // コンストラクタ 引数mapはマスの種類を文字で表した文字列ベクトルを
    Cake(vector<string> map);
    ~Cake();
    bool setStartGoal();
    void printCake();
};

Cake::Cake(vector<string> map)
{
    _h = map.size();
    _w = map.size() > 0 ? map[0].size() : 0;
    _map.resize(_h);
    for (auto &&mapi : _map)
        mapi.resize(_w);

    cutting_row.push_back(0);
    for (int i = 0; i < _h; i++)
    {
        bool berry_in_row = false;
        // 🍓に番号をつける
        // ある行に🍓が乗っていたらその下を横にきる 🍓が乗っていないケーキ一切れが無いように切る
        for (int j = 0; j < _w; j++)
        {
            if (map[i][j] == BERRY)
            {
                _berry++;
                _map[i][j] = _berry;
                berry_in_row = true;
            }
            else
                _map[i][j] = 0;
        }
        if (berry_in_row)
            cutting_row.push_back(i + 1);
    }
    // 一番下のケーキ一切れは🍓が乗っていないかnull → その上のケーキとくっつける
    cutting_row.pop_back();
    cutting_row.push_back(_h);

    // それぞれの横切りされたケーキを縦に切り分けていく
    for (int i = 0; i < cutting_row.size() - 1; i++)
    {
        // [start end) 行は今探索している横切りされたケーキ
        // 縦に切っていく
        const int start = cutting_row[i];
        const int end = cutting_row[i + 1];
        if (start == end)
            continue;

        int start_column = 0, end_column = 0;
        int owner = 0;
        // 🍓を見つけたら，🍓の右隣りを縦に切る
        for (int j = 0; j < _w; j++)
            for (int k = start; k < end; k++)
                if (_map[k][j] > 0)
                {
                    owner = _map[k][j];
                    end_column = j + 1;
                    cutCake(start, end, start_column, end_column, owner);
                    start_column = end_column;
                }
        // 一番右のケーキ一切れは🍓が乗っていないかnull → その左のケーキとくっつける
        cutCake(start, end, start_column, _w, owner);
    }
}

Cake::~Cake()
{
}
bool Cake::cutCake(int h0, int h1, int w0, int w1, int owner)
{
    for (int i = h0; i < h1; i++)
    {
        for (int j = w0; j < w1; j++)
        {
            _map[i][j] = owner;
        }
    }
    return true;
}
void Cake::printCake()
{
    for (int i = 0; i < _h; i++)
    {
        for (int j = 0; j < _w; j++)
        {
            cout << _map[i][j] << " ";
        }
        cout << endl;
    }
}
signed main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << setprecision(10);

    int h, w, k;
    cin >> h >> w >> k;
    vector<string> map(h);
    for (auto &&row_map : map)
        cin >> row_map;

    Cake sm(map);
    sm.printCake();
}


Measured memory_bytes: 1664