Codeforces Round #454 D. Seating of Students

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

#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;
}