题解:P16849 [GKS 2021 #D] Arithmetic Square
Solution
题目传送门
分析
这道题可以先统计四个不与中心有关的等差数列
组成,于是我们可以一开始统计这四个等差数列
代码:
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;
}
记录