zoukankan      html  css  js  c++  java
  • 牛客 模拟战役(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
  • 相关阅读:
    C. Tanya and Toys_模拟
    B. Qualifying Contest_排序
    A. Round House_数学问题
    广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)
    广搜,智能拼图(ZOJ1079)
    类似LIS+贪心(ZOJ1025)
    字符串处理(POJ1782)
    打表格,字符串处理,POJ(2136)
    二进制字符串匹配
    括号匹配问题
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12910218.html
Copyright © 2011-2022 走看看