题解 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);
}
}