题解
2026-08-13 13:19:32
发布于:江苏
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N = 505;
char g[N][N];
bool vis[N][N];
int n, m, k;
vector<pair<int,int>> order; // DFS 后序(先完成的在前 = 叶子)
int dr[4] = {-1, 1, 0, 0}, dc[4] = {0, 0, -1, 1};
int main(){
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
int c = getchar();
while(c == ' ' || c == '\n' || c == '\r' || c == '\t') c = getchar();
g[i][j] = c;
}
}
// 迭代 DFS 后序(显式栈防递归溢出)
for(int i = 1; i <= n && order.empty(); i++){
for(int j = 1; j <= m && order.empty(); j++){
if(g[i][j] == '.' && !vis[i][j]){
stack<tuple<int,int,int>> st;
st.push({i, j, 0});
vis[i][j] = true;
while(!st.empty()){
auto [r, c, stt] = st.top(); st.pop();
if(stt == 1){
order.push_back({r, c}); // 返回时记录(后序)
continue;
}
st.push({r, c, 1});
for(int d = 0; d < 4; d++){
int nr = r + dr[d], nc = c + dc[d];
if(nr < 1 || nr > n || nc < 1 || nc > m) continue;
if(g[nr][nc] != '.') continue;
if(vis[nr][nc]) continue;
vis[nr][nc] = true;
st.push({nr, nc, 0});
}
}
}
}
}
// order 开头 = DFS 树叶子(后序最先完成),删除 k 个保持连通
for(int idx = 0; idx < k; idx++){
auto [r, c] = order[idx];
g[r][c] = 'X';
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++) printf("%c", g[i][j]);
printf("\n");
}
return 0;
}
这里空空如也




有帮助,赞一个