题解:P14133 【MX-X22-T4】「TPOI-4D」Another Matrix Problem
题目传送门
个人觉得抽象难懂通俗易懂。
思路
- 对于第一行差值的输出,我们不难想到,从一加到偶数为止时它的和肯定为偶,此时可以把这些数分成相等两份,每份的和为总和除以二。而加到奇数为止时它们的和肯定为奇,除以二则会余一,也就代表两份的差为一。这时候,我们注意到,只要
n 为偶就输出0 ,否则输出1 。 - 接下来我们考虑如何构造。偶数的构造十分简单,从第一行开始每个数依次递增,对于它的正确性我们可以思考一下,由于黑白格是依次交错的,所以在奇数行黑白格的差会在偶数行补回来。奇数的话我们只需要在第一列从
2 摆到n-1 ,在放一个1 ,接下来后面几列按偶数的方法摆。这样又为什么是正确的呢,首先呢除去第一列和最后一行,剩下的就和n 为偶数时的抵消方式一模一样,而第一列和最后一行刚刚好黑白格可以一一对应,而左下角的那个1 就是它们最后的差值。代码
#include <bits/stdc++.h> using namespace std; int n, k, a[2010][2010]; int main() { scanf("%d", &n); if (n % 2) { a[n][1] = ++k; for (int i = 1; i < n; i++) a[i][1] = ++k; for (int i = 1; i <= n; i++) for (int j = 2; j <= n; j++) a[i][j] = ++k; } else for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] = ++k; printf("%d\n", n % 2); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) printf("%d ", a[i][j]); printf("\n"); } return 0; }
题解来之不易,且看且珍惜。
给个赞再走吧。
题目传送门