[제목] 요약
편지가 \ (N \ 회 N \ 회 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;
}