【题目概括】
现在有一个\(N\times N\times N\)的一个魔方,一开始每一个格子都是\(0\)。
每一次可以对一层中的所有数都加上\(X\)点的能量(横竖宽都可以)。
现在给定一个处理好的魔方,但是有一个格子的数值被损坏了。
请你给出损坏格子处理好的数值。
【思路要点】
- 考虑将给定的魔方还原回去。
- 每一次都将每一层的最小值都减去。
- 最后取原来那个魔方位置的值就是给定的答案。
- 时间复杂度 \(\mathcal O(n^3)\)。
【代码】
#include <bits/stdc++.h>
#define FI first
#define SE second
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define INF 0x0x3f3f3f3f0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef long double ld;
template <class T> void chkmax(T& x, T y) { x = max(x, y); }
template <class T> void chkmin(T& x, T y) { x = min(x, y); }
namespace input {
template <class T>
void read(T& x) {
x = 0; char ch = 0; int f = 1;
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
x *= f;
}
void re(int& x) { read(x); }
void re(ll& x) { read(x); }
void re(ull& x) { read(x); }
void re(char& x) { x = getchar(); }
void re(string& x) { cin >> x; }
template <class T, class... R>
void re(T& x, R&... y) {
re(x), re(y...);
}
}
using namespace input;
namespace output {
template <class T>
void write(T x) {
if (!x) { putchar('0'); return; }
if (x < 0) putchar('-'), x = -x;
static int top, stk[25]; top = 0;
while (x) stk[++top] = x % 10, x /= 10;
while (top) putchar(stk[top--] + 48);
}
void pr(int x) { write(x); }
void pr(ll x) { write(x); }
void pr(ull x) { write(x); }
void pr(char x) { putchar(x); }
void pr(string x) { cout << x; }
void pp() { putchar(' '); }
void ps() { puts(""); }
template <class T, class... R>
void pr(T x, R... y) {
pr(x), pr(y...);
}
}
using namespace output;
const int N = 105;
int n, x, y, z;
int a[N][N][N];
int main() {
re(n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++) {
re(a[i][j][k]);
if (a[i][j][k] == -1)
x = i, y = j, z = k;
}
for (int i = 1; i <= n; i++) {
int tmp = inf;
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
if (a[i][j][k] >= 0)
chkmin(tmp, a[i][j][k]);
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
a[i][j][k] -= tmp;
tmp = inf;
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
if (a[j][i][k] >= 0)
chkmin(tmp, a[j][i][k]);
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
a[j][i][k] -= tmp;
tmp = inf;
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
if (a[j][k][i] >= 0)
chkmin(tmp, a[j][k][i]);
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
a[j][k][i] -= tmp;
}
pr(-a[x][y][z] - 1, '\n');
return 0;
}