CF1676D X-Sum 题解
题意
给出一个有权值的棋盘, 现在要求你选定一个象的位置, 使象可以攻击的点的权值和最大。
象的攻击方法是斜着走。
解
看到数据范围这么小, 可以想到用暴力, 每个点都计算可能到达的地方的权值和。
至于计算权值和,四个方向模拟一下就可以了。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
constexpr int inf = INT_MAX;
constexpr i64 lnf = LONG_LONG_MAX;
constexpr int N = 210;
constexpr int dx[] = {1, -1},
dy[] = {1, -1};
int a[N][N];
void solve() {
memset(a, 0, sizeof a);
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
function<int(int, int)> dfs = [&](int x, int y) {
int X = x, Y = y, ans = 0;
while (X >= 0 && Y >= 0) {
ans += a[X][Y];
X--, Y--;
}
X = x, Y = y;
while (X >= 0 && Y < m) {
X--, Y++;
if (X >= 0 && Y < m)
ans += a[X][Y];
}
X = x, Y = y;
while (X < n && Y >= 0) {
X++, Y--;
if (X < n && Y >= 0)
ans += a[X][Y];
}
X = x, Y = y;
while (X < n && Y < m) {
X++, Y++;
if (X < n && Y < m)
ans += a[X][Y];
}
return ans;
};
int ans = -inf;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = max(ans, dfs(i, j));
}
}
cout << ans << endl;
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}