zoukankan      html  css  js  c++  java
  • 城堡

    题目:

      给出一张地图,每个位置的值意义如下:

        一个数字有以下四个数中的若干个构成:

                  1:西面有墙。

                  2:北面有墙。

                  4:东面有墙。

                  8:南面有墙。

      这个题我因为一个小错误考试只得了10分,后来又调了很久。。。

      终于,聪明的我发现我没有按题目要求做,把优先级搞错了(西面房间的优先级应该最高)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<math.h>
    using namespace std;
    int m,n,t,c;
    int f[5000][6],color[5000],s[5000];
    void dfs(int  x,int     y)
    {
        color[x]=y;
        for(int i=1;i<=f[x][0];i++)
        {
            t=f[x][i];
            if(!color[t])
                dfs(t,y);
        }
        return ;
    }
    int main()
    {
        freopen("fortress.in","r",stdin);
        freopen("fortress.out","w",stdout);
        scanf("%d%d",&m,&n);    
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&c);
            if(c<8&&i!=n)    f[i*m+j][++f[i*m+j][0]]=i*m+j+m;else c-=8;
            if(c<4&&j!=m)    f[i*m+j][++f[i*m+j][0]]=i*m+j+1;else c-=4;
            if(c<2&&i!=1)    f[i*m+j][++f[i*m+j][0]]=i*m+j-m;else c-=2;
            if(c<1&&j!=1)    f[i*m+j][++f[i*m+j][0]]=i*m+j-1;
        }
        int sum=0,maxn1=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)    
            if(!color[i*m+j])
                dfs(i*m+j,i*m+j),sum++;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            ++s[color[i*m+j]],maxn1=max(maxn1,s[color[i*m+j]]);
        printf("%d
    %d
    ",sum,maxn1);
        int maxn2=0,u,v;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            c=color[i*m+j],v=color[i*m+j+1],u=color[i*m+j+m];
            if(c!=v&&j!=m)    maxn2=max(maxn2,s[c]+s[v]);
            if(c!=u&& i!=n)    maxn2=max(maxn2,s[c]+s[u]);
        }
        printf("%d
    ",maxn2);
        for(int j=1;j<=m;j++)
        for(int i=n;i>=1;i--)
        {
            c=color[i*m+j],v=color[i*m+j+1],u=color[i*m+j-m];
            if(c!=u && s[c]+s[u]==maxn2)    
            {
                printf("%d %d N",i,j);
                return 0;
            }
            if(c!=v && s[c]+s[v]==maxn2)
            {
                printf("%d %d E",i,j);
                return 0;
            }
        }
        return 0;
    }
  • 相关阅读:
    HDU 1203 I NEED A OFFER!(0-1背包)
    poj3624 Charm Bracelet(0-1背包 滚动数组)
    Contest1803
    2019 Multi-University Training Contest 3
    Circle and Points
    分治算法应用-最近点对的最小距离-hdu 1007 Quoit Design
    2019年第二阶段我要变强个人训练赛第十七场
    2019牛客暑期多校训练营(第四场)
    2019牛客暑期多校训练营(第三场)
    2019 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7238319.html
Copyright © 2011-2022 走看看