0


2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)

  ** 个人认为很唐的一道题,考虑到不少人可能懒得写,我这里给大家发个代码叭,还有一点点题解(因为真的不是很难)。这是题面:**

    然后我来讲讲怎么做,不觉得会有多少人题目意思都理解不了叭?这个就是要求你构造一个n*m的方阵,满足经过无限次四种变换后恰好会出现四种本质不同的状态,这里的本质不同就是坐标不同的意思,大家可以好好理解下,然后我们通过手玩一部分的样例可以发现本质不同最多只会有13种状态,即k > 13的时候输出”No“,然后k在1,2,3,4,5,6,7,8,9,10,11,12,13的这几种情况中,k = 8,10,12的时候是完全不行的,对于k = 5的时候我们发现当gcd(n,m) = 1的时候也是不可行的,上述是一部分的不可行情况。

    我们的思路就是枚举k,对于每个k我们需要考虑n和m都比较小的时候也会出现不可行方案,一般来讲就是分n <= 2,m <= 2或者n <= 3和m <= 3的情况需要特殊考虑,因此剩下的我们就分k的大小构造答案就行:

** k = 1:全部站满**

** k = 2:空出一行或者一列**

** k = 3:空出不相邻的两行或者两列**

** k = 4:只放在(1,1)**

** k = 5: 一共存放LCM(n,m)个人,排列方式为每行逐渐平移下去,可以手玩一下,比如n = m = 3的情况:**

              ![](https://i-blog.csdnimg.cn/direct/a001d7b01eb54f7887bc3eb1643ba0e1.png)

** k = 6:放一个人到四个边界上的不同于端点的一点**

** 如n = 2,m = 3:**

                  ![](https://i-blog.csdnimg.cn/direct/3d316e0a3e64415884619ef678a27bae.png)

** k = 7:第一行放满,然后把第一个人放到第二行第一个或者列同理:**

                ![](https://i-blog.csdnimg.cn/direct/f3f5558a2f9c4261b5ff62e24bf5fb4d.png)

** k = 9:直接在(2,2)放上一个,或者对于n = 2,m = 3或n = 3,m = 2的情况在(1,1)(n,m)各方一个就行**

** k = 11:对于n >= 2 && m >= 4 || n >= 4 && m >= 2,在(1,2)(2,1)(1,4)或者(4,1)上共放三个,然后对于n = 3,m = 3的时候在(1,1)和(3,2)各放一个即可**

** k = 13:直接放在(1 , 3)和(3,1)**

** 上述对于小范围数据需要加特判,然后没什么思维难度,对细节处理有一定要求,我直接放下代码:**

#include<bits/stdc++.h>
#define Alex std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
#define int long long
#define double long double
const int QAQ = 0;
const int mod = 998244353;
const double pi = std::acos(-1.0);
const double eps = 1e-10;

char a[2005][2005];

signed main()
{
    Alex;
    int _;
    _ = 1;
    std::cin>>_;
    while(_--)
    {
        int n,m,k;
        std::cin>>n>>m>>k;
        for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m;j++) a[i][j] = '-';
        
        if(k > 13)
        {
            std::cout<<"No"<<'\n';
            continue;
        }
        
        if(k >= 8 && k % 2 == 0)
        {
            std::cout<<"No"<<'\n';
            continue;
        }
        
        if(k == 5 && std::__gcd(n,m) == 1)
        {
            std::cout<<"No"<<'\n';
            continue;
        }
        
        if(k == 1)
        {
            std::cout<<"Yes"<<'\n';
            for(int i = 1;i <= n;i++)
            {
                for(int j = 1;j <= m;j++) std::cout<<'*';
                std::cout<<'\n';
            }
            continue;
        }
        
        if(k == 2)
        {
            if(n == 1 && m == 1)
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            std::cout<<"Yes"<<'\n';
            if(n > 1)
            {
                for(int i = 1;i <= m;i++) std::cout<<'-';
                std::cout<<'\n';
                for(int i = 2;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<'*';
                    std::cout<<'\n';
                }    
            }else
            {
                for(int i = 1;i <= n;i++)
                {
                    std::cout<<'-';
                    for(int j = 2;j <= m;j++) std::cout<<'*';
                    std::cout<<'\n';
                }
            }
            continue;
        }
        
        if(k == 3)
        {
            if(n < 3 && m < 3)
            {
                if(n == 1 && m == 1)
                {
                    std::cout<<"No"<<'\n';
                }
                if(n == 1 && m == 2)
                {
                    std::cout<<"No"<<'\n';
                }
                if(n == 2 && m == 1)
                {
                    std::cout<<"No"<<'\n';
                }
                if(n == 2 && m == 2)
                {
                    std::cout<<"No"<<'\n';
                }
                continue;
            }
            std::cout<<"Yes"<<'\n';
            if(n >= 3)
            {
                for(int i = 1;i <= m;i++) std::cout<<'-';
                std::cout<<'\n';
                for(int i = 2;i <= n - 1;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<'*';
                    std::cout<<'\n';
                }
                for(int i = 1;i <= m;i++) std::cout<<'-';
                std::cout<<'\n';
            }else
            {
                for(int i = 1;i <= n;i++)
                {
                    std::cout<<'-';
                    for(int j = 2;j <= m - 1;j++) std::cout<<'*';
                    std::cout<<'-';
                    std::cout<<'\n';
                }
            }
            continue;
        }
        
        if(k == 4)
        {
            if(n == 1 || m == 1)
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            if(n >= 2 && m >= 2)
            {
                std::cout<<"Yes"<<'\n';
                std::cout<<'*';
                for(int j = 2;j <= m;j++) std::cout<<'-';
                std::cout<<'\n';
                for(int i = 2;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<'-';
                    std::cout<<'\n';
                }
            }
            continue;
        }
        
        if(k == 5)
        {
            std::cout<<"Yes"<<'\n';
            int lcm = n * m / std::__gcd(n,m);
            int every = lcm / n;
            for(int i = 1;i <= n;i++)
            for(int j = 1;j <= m;j++) a[i][j] = '-';
            int t = 1;
            every = m / every;
            for(int i = 1;i <= n;i++)
            {
                for(int j = t;j <= m;j = j + every) a[i][j] = '*';
                t++;
                if(t == every + 1) t = 1;
            }
            for(int i = 1;i <= n;i++)
            {
                for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                std::cout<<'\n';
            }
            continue;
        }
        
        if(k == 6)
        {
            if(n >= 3 && m >= 2 || n >= 2 && m >= 3)
            {
                std::cout<<"Yes"<<'\n';
                if(n >= 3)
                {
                    for(int i = 1;i <= m;i++) std::cout<<'-';
                    std::cout<<'\n';
                    std::cout<<'*';
                    for(int i = 2;i <= m;i++) std::cout<<'-';
                    std::cout<<'\n';
                    for(int i = 3;i <= n;i++) 
                    {
                        for(int j = 1;j <= m;j++) std::cout<<'-';
                        std::cout<<'\n';
                    }
                }else
                {
                    std::cout<<'-'<<'*';
                    for(int i = 3;i <= m;i++) std::cout<<'-';
                    std::cout<<'\n';
                    for(int i = 2;i <= n;i++)
                    {
                        for(int j = 1;j <= m;j++) std::cout<<'-';
                        std::cout<<'\n';
                    }
                }
            }else
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            continue;
        }
        
        if(k == 7)
        {
            if(n >= 3 && m >= 2 || m >= 3 && n >= 2)
            {
                std::cout<<"Yes"<<'\n';
                for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) a[i][j] = '-';
                if(n >= 3)
                {
                    for(int i = 1;i <= m;i++) a[1][i] = '*';
                    std::swap(a[1][1],a[2][1]);
                    for(int i = 1;i <= n;i++)
                    {
                        for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                        std::cout<<'\n';
                    }
                }else
                {
                    for(int i = 1;i <= n;i++) a[i][1] = '*';
                    std::swap(a[1][1],a[1][2]);
                    for(int i = 1;i <= n;i++)
                    {
                        for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                        std::cout<<'\n';
                    }
                }
            }else
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            continue;
        }
        
        if(k == 9)
        {
            if(n >= 3 && m >= 3)
            {
                std::cout<<"Yes"<<'\n';
                for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) a[i][j] = '-';
                a[2][2] = '*';
                for(int i = 1;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                    std::cout<<'\n';
                }
            }else
            if(n == 2 && m >= 3 || n >= 3 && m == 2)
            {
                std::cout<<"Yes"<<'\n';
                for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) a[i][j] = '-';
                a[1][1] = '*';
                a[n][m] = '*';
                for(int i = 1;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                    std::cout<<'\n';
                }
            }else
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            continue;
        }
        
        if(k == 11)
        {
            if(n >= 2 && m >= 4 || n >= 4 && m >= 2)
            {
                std::cout<<"Yes"<<'\n';
                if(n >= 2 && m >= 4)
                {
                    for(int i = 1;i <= n;i++)
                    for(int j = 1;j <= m;j++) a[i][j] = '-';
                    a[1][2] = '*',a[2][1] = '*',a[1][4] = '*';
                    for(int i = 1;i <= n;i++)
                    {
                        for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                        std::cout<<'\n';
                    }
                }else
                {
                    for(int i = 1;i <= n;i++)
                    for(int j = 1;j <= m;j++) a[i][j] = '-';
                    a[1][2] = '*',a[2][1] = '*',a[4][1] = '*';
                    for(int i = 1;i <= n;i++)
                    {
                        for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                        std::cout<<'\n';
                    }    
                }
            }else
            if(n == 3 && m == 3)
            {
                std::cout<<"Yes"<<'\n';
                for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) a[i][j] = '-';
                a[1][1] = '*';
                a[3][2] = '*';
                for(int i = 1;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                    std::cout<<'\n';
                }
            }
            else
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            continue;
        }
        
        if(k == 13)
        {
            if(n >= 3 && m >= 3)
            {
                std::cout<<"Yes"<<'\n';
                for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) a[i][j] = '-';
                a[1][3] = '*';
                a[3][1] = '*';
                for(int i = 1;i <= n;i++)
                {
                    for(int j = 1;j <= m;j++) std::cout<<a[i][j];
                    std::cout<<'\n';    
                }    
            }else
            {
                std::cout<<"No"<<'\n';
                continue;
            }
            continue;
        }
    }
    return QAQ;
}
 OK辣,那么这道题目就被秒了~![](https://i-blog.csdnimg.cn/direct/933ba95022cc41f9a726dc339c96e059.jpeg)
标签: 网络 算法 c++

本文转载自: https://blog.csdn.net/Zz_0913/article/details/142066666
版权归原作者 Zz_0913 所有, 如有侵权,请联系我们删除。

“2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)”的评论:

还没有评论