题意
题意,给出n,m,k,三个长度,n,m,分别为地图的长宽,地图中有墙壁‘#’和空位置‘.’
想把k个空位置变成墙壁(用x表示)使‘.’还为一个连通区域
思路
想在‘.’中选择k个位置变成墙壁使剩下的点保持连通,那我们是不是可以反过来想呢?我们先让所有点的位置变为X
再用一个dfs找出要剩下的几个点这样他们肯定连通,问题得以解决.
AC 代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<sstream>
#include<stack>
#include<queue>
using namespace std;
int n,m,k,o=0,l=0;
char p[520][520];
int x1[]={1,0,-1,0};
int YY[]={0,1,0,-1};//方向数组
void dfs(int x,int y)
{
if(o==l-k)
{
return ;}//找够了点就返回
o++;
p[x][y]='.';
//printf("%d ",o);
for(int i=0;i<4;i++)
{
int xx=x+x1[i],yy=y+YY[i];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&p[xx][yy]=='X')//判断位置是否合法
{dfs(xx,yy);
if(o==l-k)
return ;
//o--;
// p[xx][yy]='X';
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin>>n>>m>>k;
for(int i=0;i<n;i++)
cin>>p[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(p[i][j]=='.')
{p[i][j]='X';
l++;}//统计点的数量并把点换为‘X’
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
o=0;
if(p[i][j]=='X')//只要一个点是‘X’就用dfs
dfs(i,j);
if(o==l-k)//l为原来一共有几个点,k为要使几个点变成墙,o是找到的点,如果相同就输出并结束程序
{
for(int k=0;k<n;k++)
printf("%s\n",p[k]);
return 0;}
}
}