题解:P16849 [GKS 2021 #D] Arithmetic Square

· · 题解

Solution

题目传送门

分析

这道题可以先统计四个不与中心有关的等差数列

\{G_{0, 0}, G_{0, 1}, G_{0, 2}\}, \{G_{2, 0}, G_{2, 1}, G_{2, 2}\}, \\ \{G_{0, 0}, G_{1, 0}, G_{2, 0}\}, \{G_{0, 2}, G_{1, 2}, G_{2, 2}\}, \\

组成,于是我们可以一开始统计这四个等差数列

代码:

if(g[0][0] - g[0][1] == g[0][1] - g[0][2]) ans++;
if(g[2][0] - g[2][1] == g[2][1] - g[2][2]) ans++;
if(g[0][0] - g[1][0] == g[1][0] - g[2][0]) ans++;
if(g[0][2] - g[1][2] == g[1][2] - g[2][2]) ans++;

接着,我们来看关于中心的四个等差数列

注意到只有三项的等差数列的中间项是前后两项的平均数,且我们只能用整数填进框内。所以如果前后两项的和是奇数,我们不可以填一个数使得三个数组成等差数列。
接着我们就可以愉快的统计了。
代码:

 int zhudui, fudui, zhonglie, zhonghang;
    bool flg = 0;//是否全部都不可以填
    if((g[0][0] + g[2][2]) % 2 == 0) zhudui = (g[0][0] + g[2][2]) / 2, flg = 1;
    else zhudui = 0x3F3F3FA;
    if((g[0][2] + g[2][0]) % 2 == 0) fudui = (g[0][2] + g[2][0]) / 2, flg = 1;
    else fudui = 0x3F3F3F3B;
    if((g[0][1] + g[2][1]) % 2 == 0) zhonglie = (g[0][1] + g[2][1]) / 2, flg = 1;
    else zhonglie = 0x3F3F3F3C;
    if((g[1][0] + g[1][2]) % 2 == 0) zhonghang = (g[1][0] + g[1][2]) / 2, flg = 1;
    else zhonghang = 0x3F3F3F3D;
    if(zhudui == fudui && fudui == zhonglie && zhonglie == zhonghang) ans += 4;
    else if((zhudui == fudui && zhudui == zhonglie) ||
    (zhudui == zhonghang && zhudui == zhonglie) || 
    (zhudui == fudui && zhudui == zhonghang) || 
    (zhonghang == fudui && zhonghang == zhonglie)) ans += 3;
    else if((zhudui == fudui) ||
    (zhudui == zhonglie) ||
    (zhudui == zhonghang) ||
    (fudui == zhonglie) ||
    (fudui == zhonghang) ||
    (zhonglie == zhonghang)) ans += 2;
    else if(flg) ans++;//四个都不一样

最终代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int g[3][3];
void solve(int x) {
    int ans = 0;
    cin >> g[0][0] >> g[0][1] >> g[0][2] >> g[1][0] >> g[1][2] >> g[2][0] >> g[2][1] >> g[2][2];
    if(g[0][0] - g[0][1] == g[0][1] - g[0][2]) ans++;
    if(g[2][0] - g[2][1] == g[2][1] - g[2][2]) ans++;
    if(g[0][0] - g[1][0] == g[1][0] - g[2][0]) ans++;
    if(g[0][2] - g[1][2] == g[1][2] - g[2][2]) ans++;
    int zhudui, fudui, zhonglie, zhonghang;
    bool flg = 0;
    if((g[0][0] + g[2][2]) % 2 == 0) zhudui = (g[0][0] + g[2][2]) / 2, flg = 1;
    else zhudui = 0x3F3F3FA;
    if((g[0][2] + g[2][0]) % 2 == 0) fudui = (g[0][2] + g[2][0]) / 2, flg = 1;
    else fudui = 0x3F3F3F3B;
    if((g[0][1] + g[2][1]) % 2 == 0) zhonglie = (g[0][1] + g[2][1]) / 2, flg = 1;
    else zhonglie = 0x3F3F3F3C;
    if((g[1][0] + g[1][2]) % 2 == 0) zhonghang = (g[1][0] + g[1][2]) / 2, flg = 1;
    else zhonghang = 0x3F3F3F3D;
    if(zhudui == fudui && fudui == zhonglie && zhonglie == zhonghang) ans += 4;
    else if((zhudui == fudui && zhudui == zhonglie) ||
    (zhudui == zhonghang && zhudui == zhonglie) || 
    (zhudui == fudui && zhudui == zhonghang) || 
    (zhonghang == fudui && zhonghang == zhonglie)) ans += 3;
    else if((zhudui == fudui) ||
    (zhudui == zhonglie) ||
    (zhudui == zhonghang) ||
    (fudui == zhonglie) ||
    (fudui == zhonghang) ||
    (zhonglie == zhonghang)) ans += 2;
    else if(flg) ans++;
    cout << "Case #" << x << ": " << ans << "\n";
}
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int T;
    cin >> T;
    for(int i = 1; i <= T; i++) solve(i);
    return 0;
}

记录