题目:
n*m的图中有若干个水沟,想填平水沟使其只剩K个,问需要多少个砖。
题解:
爆搜啊不然还想咋地。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Point{
int x,y;
Point(){}
Point(int x,int y){
this->x=x;
this->y=y;
}
};
int n,m,k;
char map[3010][3010];
bool vis[3010][3010];
vector<Point> vec[3010];
vector<int> vvv;
void dfs(int bit,int x,int y){
if(x<0||x>=n) return ;
if(y<0||y>=m) return ;
if(map[x][y]=='*') return ;
if(vis[x][y]) return ;
vis[x][y]=1;
vec[bit].push_back(Point(x,y));
int ret=0;
dfs(bit,x+1,y);
dfs(bit,x-1,y);
dfs(bit,x,y+1);
dfs(bit,x,y-1);
}
string str;
bool cmp(vector<Point> a,vector<Point> b){
return a.size()<b.size();
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<n;i++){
cin>>str;
for(int j=0;j<m;j++){
map[i][j]=str[j];
}
}
int bit=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]=='.'&&!vis[i][j]){
dfs(bit,i,j);
bit++;
}
}
}
int ans=0;
int cnt=0;
sort(vec,vec+bit,cmp);
for(int i=0;i<bit;i++){
bool flag=true;
for(int j=0;j<vec[i].size();j++){
if(vec[i][j].x==0||vec[i][j].x==n-1||vec[i][j].y==0||vec[i][j].y==m-1){
flag=false;
break;
}
}
if(flag){
vvv.push_back(i);
}
}
int all=vvv.size();
for(int i=0;i<vvv.size();i++){
if(all==k) break;
int bit=vvv[i];
ans+=vec[bit].size();
for(int j=0;j<vec[bit].size();j++){
map[vec[bit][j].x][vec[bit][j].y]='*';
}
all--;
}
cout<<ans<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<map[i][j];
}
cout<<endl;
}
}