mayoko’s diary

プロコンとかいろいろ。

Codeforces Round #222 (Div. 1) A. Maze

解法

まず空いてるマスのすべてを 'X' にし, 'X' となっている好きな点から幅優先探索して '.' を広げていけば良いです。

string field[505];
bool done[505][505];

int n, m, k;

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> n >> m >> k;
    int sy, sx, cnt = 0;
    for (int i = 0; i < n; i++) {
        cin >> field[i];
        for (int j = 0; j < m; j++) {
            if (field[i][j] == '.') {
                cnt++;
                field[i][j] = 'X';
                sy = i;
                sx = j;
            }
        }
    }
    queue<pii> que;
    que.push(pii(sy, sx));
    done[sy][sx] = true;
    k = cnt-k;
    while (k > 0) {
        auto p = que.front(); que.pop();
        int y = p.first, x = p.second;
        field[y][x] = '.';
        k--;
        for (int i = 0; i < 4; i++) {
            int ny = y+dy[i], nx = x+dx[i];
            if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
            if (field[ny][nx] == 'X' && !done[ny][nx]) {
                que.push(pii(ny, nx));
                done[ny][nx] = true;
            }
        }
    }
    for (int i = 0; i < n; i++) cout << field[i] << endl;
    return 0;
}