题意
给你一个n*n的由0~9组成的矩阵,问你相同数组组成的三角形,其中一条边必须平行于x轴或y轴,而且可以自己随机加一个点,然后问你0~9数组分别组成的三角形的面积乘以2的最大值。
思路
首先找出每个数字的x轴方向最大最小,y轴方向最大最小,然后去遍历每个相应的点和这些最大最小组合后的最大面积。
自己选的一个点一定是选在边界的
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 100;
typedef long long LL;
//#define int long long
int a[N][N];
int xmax[10], ymax[10], xmin[10], ymin[10], ans[10];
void solve() {
int n ;
scanf("%d", &n);
for (int i = 0; i < 10; ++i) {
xmax[i] = ymax[i] = ans[i] = 0;
xmin[i] = ymin[i] = 1e9 + 10;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int x; scanf("%1d", &a[i][j]);
x = a[i][j];
xmax[x] = max(xmax[x], j);
xmin[x] = min(xmin[x], j);
ymax[x] = max(ymax[x], i);
ymin[x] = min(ymin[x], i);
}
}
for (int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
int x = a[i][j];
if (xmax[x] != 0) ans[x] = max(ans[x], abs(xmax[x] - j) * max(i - 1, n - i));
if (xmin[x] != 1e9 + 10) ans[x] = max(ans[x], abs(j -xmin[x]) * max(i - 1, n - i));
if (ymax[x] != 0) ans[x] = max(ans[x], abs(ymax[x] - i) * max(j - 1, n - j));
if (ymin[x] != 1e9 +10) ans[x] = max(ans[x], abs(ymin[x] - i) * max(j - 1, n - j));
}
}
for (int i = 0; i <= 9; ++i) {
if (i) printf(" ");
printf("%d", ans[i]);
}
printf("
");
}
signed main() {
int T = 1;
scanf("%d", &T);
// cin >> T;
while (T--) {
solve();
}
}