题意:一个n*m的迷宫,#代表墙,已知所有的.是联通的,现在要求填充K个.为#,使得.依旧联通
题解:对一个联通块进行dfs可以得到一颗树,填充应该从只有一个.相邻的.开始,所以填充过程应该是从叶子节点开始
#include <bits/stdc++.h> #define maxn 101000 #define INF 0x3f3f3f3f typedef long long ll; using namespace std; char a[550][550]; int n, m, k, dir[550][550]; void dfs(int i,int j){ int num = 0, flag = 0; if(a[i][j] != '.'||k<=0||dir[i][j] == 1) return ; dir[i][j] = 1; if(a[i+1][j] == '.'&&dir[i+1][j] == 0) dfs(i+1, j); if(a[i][j+1] == '.'&&dir[i][j+1] == 0) dfs(i, j+1); if(a[i-1][j] == '.'&&dir[i-1][j] == 0) dfs(i-1, j); if(a[i][j-1] == '.'&&dir[i][j-1] == 0) dfs(i, j-1); if(k>0) a[i][j] = 'X',k--; } int main(){ scanf("%d%d%d", &n, &m, &k); for(int i=1;i<=n;i++) scanf("%s", a[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dfs(i, j); for(int i=1;i<=n;i++) printf("%s ", a[i]+1); return 0; }