牛客 模拟战役(dfs)

求一下连通块后贪心

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=3e5+10;
const int mod=1000000007;
int pos1[N];
int pos[N];
int st[20][2200];
string s[10];
int num;
int m;
void dfs1(int a,int b){
    if(s[a][b]=='.')
        return ;
    if(s[a][b]=='*'&&!st[a][b]){
        num++;
        st[a][b]=1;
    }
    else{
        return ;
    }
    int i,j;
    for(i=-1;i<=1;i++){
        for(j=-1;j<=1;j++){
            int x=a+i,y=b+j;
            if(!i&&!j)
                continue;
            if(x>0&&x<5&&y>=0&&y<m){
                dfs1(x,y);
            }
        }
    }
}
void dfs2(int a,int b){
    if(s[a][b]=='.')
        return ;
    if(s[a][b]=='*'&&!st[a][b]){
        num++;
        st[a][b]=1;
    }
    else{
        return ;
    }
    int i,j;
    for(i=-1;i<=1;i++){
        for(j=-1;j<=1;j++){
            int x=a+i,y=b+j;
            if(!i&&!j)
                continue;
            if(x>4&&x<=8&&y>=0&&y<m){
                dfs2(x,y);
            }
        }
    }
}
int main(){
    cin>>m;
    int i,j;
    for(i=1;i<=4;i++){
        cin>>s[i];
    }
    for(i=5;i<=8;i++){
        cin>>s[i];
    }
    int cnt=0;
    for(i=1;i<=4;i++){
        for(j=0;j<m;j++){
            if(s[i][j]=='*'&&!st[i][j]){
                num=0;
                dfs1(i,j);
                pos[cnt++]=num;
            }

        }
    }
    int tmp=cnt;
    cnt=0;
    for(i=5;i<=8;i++){
        for(j=0;j<m;j++){
            num=0;
            if(s[i][j]=='*'&&!st[i][j]){
                dfs2(i,j);
                pos1[cnt++]=num;
            }
        }
    }
    sort(pos1,pos1+cnt);
    if(cnt<tmp)
        cout<<-1<<endl;
    else{
        int res=0;
        for(i=tmp-1;i<cnt;i++)
            res+=pos1[i];
        cout<<res<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12910218.html