• Codeforces Round #454 D. Seating of Students


    分三类
    1 1: 一个就好了
    3 3:特殊讨论下
    n4m4 : 第一行奇序号的数放前面,偶序号的数放后面,第二行奇序号的数放前面,偶序号的数放后面,第二行依次类推
    有点难写,真的菜

    #include<iostream>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 1e5 + 5;
    #define MS(x,y) memset(x,y,sizeof(x))
    #define MP(x, y) make_pair(x, y)
    const int INF = 0x3f3f3f3f;
    
    map<pair<int, int>, int> mp;
    int vc[N];
    
    
    int main() {
        int n, m;
        while(~scanf("%d %d", &n, &m)) {
            mp.clear();
            for(int i = 0; i < n; ++i) {
                for(int j = 0; j < m; ++j) {
                    mp[MP(i, j)] = i*m + j;
                }
            }
    
            if(n == 1 && m == 1) {
                printf("YES
    1
    ");
            }else if(n == 3 && m == 3) {
                printf("YES
    ");
                printf("6 1 8
    7 5 3
    2 9 4
    ");
            }else if(n >= 4) {
                printf("YES
    ");
                for(int i = 0; i < m; ++i) {
                    int cnt = 0;
                    for(int j = 0; j < n; ++j) {
                        vc[cnt ++] = mp[MP(j, i)];
                    }
                    if(n == 4) {
                        if(i & 1) { mp[MP(0, i)] = vc[2]; mp[MP(1, i)] = vc[0]; mp[MP(2, i)] = vc[3]; mp[MP(3, i)] = vc[1]; }
                        else      { mp[MP(0, i)] = vc[1]; mp[MP(1, i)] = vc[3]; mp[MP(2, i)] = vc[0]; mp[MP(3, i)] = vc[2]; }
                        continue;
                    }
                    int tt = 0;
                    if(i & 1) {
                        for(int j = 0; j < cnt; j += 2) mp[MP(tt++, i)] = vc[j];
                        for(int j = 1; j < cnt; j += 2) mp[MP(tt++, i)] = vc[j];
                    }else {
                        for(int j = 1; j < cnt; j += 2) mp[MP(tt++, i)] = vc[j];
                        for(int j = 0; j < cnt; j += 2) mp[MP(tt++, i)] = vc[j];
    
                    }
                }
                for(int i = 0; i < n; ++i) {
                    for(int j = 0; j < m; ++j) printf("%d ", mp[MP(i, j)] + 1);
                    printf("
    ");
                }       
            }else if(m >= 4) {
                printf("YES
    ");
                for(int i = 0; i < n; ++i) {
                    int cnt = 0;
                    for(int j = 0; j < m; ++j) {
                        vc[cnt ++] = mp[MP(i, j)];
                    }
                    if(m == 4) {
                        if(i & 1) { mp[MP(i, 0)] = vc[2]; mp[MP(i, 1)] = vc[0]; mp[MP(i, 2)] = vc[3]; mp[MP(i, 3)] = vc[1]; }
                        else      { mp[MP(i, 0)] = vc[1]; mp[MP(i, 1)] = vc[3]; mp[MP(i, 2)] = vc[0]; mp[MP(i, 3)] = vc[2]; }
                        continue;
                    }
                    int tt = 0;
                    if(i & 1) {
                        for(int j = 0; j < cnt; j += 2) mp[MP(i, tt++)] = vc[j];
                        for(int j = 1; j < cnt; j += 2) mp[MP(i, tt++)] = vc[j];
                    }
                    else {
                        for(int j = 1; j < cnt; j += 2) mp[MP(i, tt++)] = vc[j];
                        for(int j = 0; j < cnt; j += 2) mp[MP(i, tt++)] = vc[j];
                    }
                }
                for(int i = 0; i < n; ++i) {
                    for(int j = 0; j < m; ++j) printf("%d ", mp[MP(i, j)] + 1);
                    printf("
    ");
                }       
            }else printf("NO
    ");
        }
        return 0;
    }
  • 相关阅读:
    JS字符串去重
    svn回退到某一版本
    WebStorm格式化代码4个空格设置
    DevExpress中 的DataGrid每一行根据其类型显示控件的种类
    各大系统刷新DNS缓存方法
    Kali Linux中前十名的Wifi攻击工具
    CentOS远程执行漏洞
    判断是否移动端的几种方法
    笔记
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433685.html
Copyright © 2020-2023  润新知