Codeforces378C Maze

题意:一个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\n", a[i]+1);
    return 0;
}

 

posted on 2018-01-22 16:57  2855669158  阅读(110)  评论(0编辑  收藏  举报

导航