• hihoCoder 1257 Snake Carpet(很简单的构造方法)


    2015 ACM / ICPC 北京现场赛 I 题

    构造

    注意一个小坑,每条蛇的输出是要从头到尾输出的。

    还要注意的是,不能开数组去模拟构造过程,然后输出,那样会TLE的。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int maxn=500+10;
    vector<int> G[maxn];
    int Find[maxn][3];
    int n;
    int R1,C1,R2,C2;
    int tot;
    
    int ans[maxn][maxn];
    
    void f()
    {
        Find[2][1]=1; Find[2][2]=2; Find[4][2]=2;
        for(int i=4;i<=500;i=i+2) 
        {
            if(i%4==0) Find[i][1]=Find[i-2][1]+2;
            else Find[i][1]=Find[i-2][1];
        }
        
        for(int i=4;i<=500;i=i+2)
        {
            if(i%4==2) Find[i][2]=Find[i-2][2]+2;
            else Find[i][2]=Find[i-2][2];
        }
    }
    
    void init()
    {
        //清空
        for(int i=0;i<=n;i++) G[i].clear();
        tot=0;
        
        //确定左图的大小
        R1=C1=(n+1)/2;
        
        //确定右图的大小
        if(n%2==1){
            R2=Find[n-1][1];
            C2=Find[n-1][2];
        }
        else {
            R2=Find[n][1];
            C2=Find[n][2];
        }
    }
    
    void odd()
    {
        for(int i=1;i<=n;i=i+2)
        {
            tot++;
            for(int j=1;j<=tot;j++)
            {
                G[i].push_back(tot);
                G[i].push_back(j);
                
                ans[tot][j]=i;
            }
            for(int j=tot-1;j>=1;j--)
            {
                G[i].push_back(j);
                G[i].push_back(tot);
                
                ans[j][tot]=i;
            }
        }
    }
    
    void even()
    {
        if(R1==R2)
        {
            int NowR=1;
            int NowC=0;
                
            for(int i=2;i<=n;i=i+2)
            {
                
                //横着画
                if(i%4==0)
                {
                    for(int j=1;j<=i/2;j++) 
                    {
                        G[i].push_back(NowR+1);
                        G[i].push_back(j+C1);
                        
                        ans[NowR+1][j+C1]=i;
                    }
                    
                    for(int j=i/2;j>=1;j--) 
                    {
                        G[i].push_back(NowR+2);
                        G[i].push_back(j+C1);
                        
                        ans[NowR+2][j+C1]=i;
                    }
                    NowR=NowR+2;
                } 
                
                //竖着画
                else
                {
                    for(int j=1;j<=i/2;j++) 
                    {
                        G[i].push_back(j);
                        G[i].push_back(NowC+1+C1);
                        
                        ans[j][NowC+1+C1]=i;
                    }
                    
                    for(int j=i/2;j>=1;j--) 
                    {
                        G[i].push_back(j);
                        G[i].push_back(NowC+2+C1);
                        
                        ans[j][NowC+2+C1]=i;
                    }
                    NowC=NowC+2;
                }
            }
        }
        else if(R1==C2)
        {
            swap(R2,C2);
        
            int NowR=R2+1;
            int NowC=1;
            
            for(int i=2;i<=n;i=i+2)
            {
                //竖着画
                
                if(i%4==0)
                {
                    for(int j=R2;j>=R2-i/2+1;j--)
                    {
                        G[i].push_back(j);
                        G[i].push_back(NowC+1+C1);
                        
                        ans[j][NowC+1+C1]=i;
                    }
                    
                    for(int j=R2-i/2+1;j<=R2;j++)
                    {
                        G[i].push_back(j);
                        G[i].push_back(NowC+2+C1);
                        
                        ans[j][NowC+2+C1]=i;
                    }
                    NowC=NowC+2;
                }
                
                //横着画
                else 
                {
                    for(int j=1;j<=i/2;j++)
                    {
                        G[i].push_back(NowR-1);
                        G[i].push_back(j+C1);
                        
                        ans[NowR-1][j+C1]=i;
                    }
                    
                    for(int j=i/2;j>=1;j--)
                    {
                        G[i].push_back(NowR-2);
                        G[i].push_back(j+C1);
                        
                        ans[NowR-2][j+C1]=i;
                    }
                    NowR=NowR-2;
                }
            }
        }
    }
    
    void print()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<G[i].size();j++)
            {
                printf("%d",G[i][j]);
                if(j<G[i].size()-1) printf(" ");
                else printf("
    ");
            }
        }
    }
    
    int main()
    {
        f();
        while(~scanf("%d",&n))
        {
            init();//初始化
            odd();//左图
            even();//右图
            /*
            for(int i=1;i<=R1;i++)
            {
                for(int j=1;j<=C1+C2;j++)
                {
                    printf("%5d",ans[i][j]);
                }
                printf("
    ");
            }
            */
            printf("%d %d
    ",R1,C1+C2);
            print();//输出
        }
        return 0;
    }
  • 相关阅读:
    lambda 是个啥玩意
    python中读写操作plist
    通过os中的os.path.basename获取路径中的文件名
    python遍历目录的两种方法
    mac下已有pyhon2.7,装了python3 之后,怎么调用python3啊
    Python: easy_install & pip 下载PyPi 公共资源库的工具
    安装python的图形处理库: pillow
    minSdkVersion, targetSdkVersion, targetApiLevel,compileSdkVersion,buildToolsVersion
    bat 批量修改文件名字
    a b两向量叉乘 <0说明a在b左边
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4977956.html
Copyright © 2020-2023  润新知