CF 732D

题目:

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;
    }
}

猜你喜欢

转载自blog.csdn.net/mengwuyaaa/article/details/79961189