题解 CF1179B 【Tolik and His Uncle】

· · 题解

分析

明显是一道构造题 构造题,可以从小的例子开始构造,寻找规律

首先,我们看一维的例子:

1,2: (1,1)->(1,2)

1,3: (1,1)->(1,3)->(1,2)

1,4: (1,1)->(1,4)->(1,2)->(1,3)

1,5: (1,1)->(1,5)->(1,2)->(1,4)->(1,3)

容易发现对于一维的构造我们可以通过关于中心对称的方法构造,因为左右指针向中间靠,则每次的移动距离为n-i(i为移动步数)

那这个方法能不能扩展到二维呢?

即关于中心对称

对于两行的情况 2,3:

(1,1)->(2,3)->(1,2)->(2,2)->(1,3)->(2,1)

每两次移动为(1,n - i)和(-1,n - 1 - i)

关于每两行都如是操作

对于正中的行如一维操作即可

代码

#include <iostream>
#include <cstdio>
using namespace std;
#pragma warning (disable:4996)
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n / 2; i++) {  //对于每两行关于中心对称
        for (int j = 1; j <= m; j++) {
            printf("%d %d\n", i, j);
            printf("%d %d\n", n + 1 - i, m + 1 - j);
        }
    }
    if (n & 1) {    //中间行如一维操作
        n = (n + 1) / 2;
        for (int i = 1; i <= m / 2; i++) {
            printf("%d %d\n", n, i);
            printf("%d %d\n", n, m + 1 - i);
        }
        if (m & 1) printf("%d %d\n", n, (m + 1) / 2);
    }
}