#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
#define endl "\n"
int R, C, N;
char map[200][200];
int dir[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
int check[200][200];
void bfs(queue <pair<int, int>> bomb) {
while (!bomb.empty()) {
pair <int, int> now = bomb.front();
bomb.pop();
int x = now.first;
int y = now.second;
map[x][y] = '.';
check[x][y] = 0;
for (int i = 0; i < 4; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
map[nx][ny] = '.';
check[nx][ny] = 0;
}
}
}
int main() {
cin >> R >> C >> N;
queue <pair<int, int>> bomb;
for (int i = 0; i < R; i++) {
string str;
cin >> str;
for (int j = 0; j < C; j++) {
map[i][j] = str[j];
if (map[i][j] == 'O') {
bomb.push({ i, j });
check[i][j] = 1;
}
}
}
for (int i = 2; i <= N; i++) {
if (i % 2 == 0) {
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++) {
map[j][k] = 'O';
check[j][k] = 1;
}
}
}
else {
bfs(bomb);
bomb = queue<pair<int, int>>();
for (int j = 0; j < R; j++) {
for (int k = 0; k < C; k++) {
if (check[j][k]) {
bomb.push({ j, k });
}
}
}
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cout << map[i][j];
}
cout << endl;
}
return 0;
}