Codeforces Round #222 (Div. 1) 377A - Maze (连通块)
一个 n × m 大小的矩阵,其中 “#” 代表墙,“.” 代表空格,所有“.”可以连通,现在要求减少 k 个空格后剩余空格仍然连通
题解:
就是要求剩下 cnt=sum-k 个空格仍然连通,也就是找个起点形成一个含有cnt个空格的连通块。
Code:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define Please return
#define Accepted 0
#define int long long
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
const int N = 510,M=2*N,INF=0x3f3f3f3f;
int n,m,k,cnt,sum;
char a[N][N],b[N][N];
bool st[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
void dfs(int x,int y)
{
if(cnt==0) return ;
if(x<1||x>n||y<1||y>m) return ;
if(st[x][y]||a[x][y]!='.') return ;
cnt--;
st[x][y]=true,a[x][y]='A';
for(int i=0;i<4;i++)
{
dfs(x+dx[i],y+dy[i]);
}
}
void slove(int _case)
{
int sx,sy;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='.'){
cnt++;
sx=i,sy=j;
}
}
}
cnt-=k;
dfs(sx,sy);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='A') printf(".");
else if(a[i][j]=='.') printf("X");
else printf("#");
}
printf("\n");
}
}
signed main()
{
ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
for(int _case=1;_case<=T;_case++)
{
slove(_case);
}
Please Accepted;
}