#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <tuple>
using namespace std;
// Định nghĩa kiểu dữ liệu cho key của DP: (x1, y1, z1, x2, y2, z2)
using State = tuple<int, int, int, int, int, int>;
// Khai báo dynamic vectors cho Status và PrefixSum, sử dụng 1-based indexing
vector<vector<vector<int>>> Status;
vector<vector<vector<int>>> PrefixSum;
// Sử dụng map cho Memoization (DP table)
map<State, int> DP;
int X, Y, Z;
/**
* @brief Tính số khối '1' trong khối con [x1, y1, z1] đến [x2, y2, z2] (1-based index)
*/
int count_ones(int x1, int y1, int z1, int x2, int y2, int z2) {
if (x1 > x2 || y1 > y2 || z1 > z2) return 0;
// Sử dụng PrefixSum 3D với nguyên tắc loại trừ-bao hàm
int res = PrefixSum[x2][y2][z2];
// 1 lần trừ
res -= PrefixSum[x1-1][y2][z2] + PrefixSum[x2][y1-1][z2] + PrefixSum[x2][y2][z1-1];
// 2 lần trừ (cần cộng lại)
res += PrefixSum[x1-1][y1-1][z2] + PrefixSum[x1-1][y2][z1-1] + PrefixSum[x2][y1-1][z1-1];
// 3 lần trừ (cần trừ đi)
res -= PrefixSum[x1-1][y1-1][z1-1];
return res;
}
/**
* @brief Hàm Quy hoạch động (6D DP) tìm chi phí tối thiểu để phủ khối con.
*/
int solve(int x1, int y1, int z1, int x2, int y2, int z2) {
// 1. Trường hợp Cơ sở: Khối không có khối 1 nào
if (count_ones(x1, y1, z1, x2, y2, z2) == 0) {
return 0;
}
// 2. Memoization
State current_state = {x1, y1, z1, x2, y2, z2};
if (DP.count(current_state)) {
return DP[current_state];
}
// 3. Tính Chi phí Tối thiểu
int dx = x2 - x1 + 1;
int dy = y2 - y1 + 1;
int dz = z2 - z1 + 1;
// Lựa chọn 1: Phủ bằng một khối (Single Cover)
// Chi phí = min(dx, dy, dz)
int min_cost = min({dx, dy, dz});
// Lựa chọn 2: Tách (Split)
// Tách dọc theo X
for (int x = x1; x < x2; ++x) {
// Tách thành [x1..x] và [x+1..x2]
min_cost = min(min_cost, solve(x1, y1, z1, x, y2, z2) + solve(x + 1, y1, z1, x2, y2, z2));
}
// Tách dọc theo Y
for (int y = y1; y < y2; ++y) {
// Tách thành [y1..y] và [y+1..y2]
min_cost = min(min_cost, solve(x1, y1, z1, x2, y, z2) + solve(x1, y + 1, z1, x2, y2, z2));
}
// Tách dọc theo Z
for (int z = z1; z < z2; ++z) {
// Tách thành [z1..z] và [z+1..z2]
min_cost = min(min_cost, solve(x1, y1, z1, x2, y2, z) + solve(x1, y1, z + 1, x2, y2, z2));
}
// Lưu kết quả và trả về
return DP[current_state] = min_cost;
}
void solve_test_case() {
if (!(cin >> X >> Y >> Z)) return;
// Reset DP map
DP.clear();
// Khởi tạo dynamic vectors với kích thước X+1, Y+1, Z+1 cho 1-based indexing
Status.assign(X + 1, vector<vector<int>>(Y + 1, vector<int>(Z + 1, 0)));
PrefixSum.assign(X + 1, vector<vector<int>>(Y + 1, vector<int>(Z + 1, 0)));
// Đọc Input và xây dựng PrefixSum
for (int k = 1; k <= X; ++k) { // X-coordinate (Ma trận k-th)
for (int i = 1; i <= Y; ++i) { // Y-coordinate (Hàng i-th)
for (int j = 1; j <= Z; ++j) { // Z-coordinate (Cột j-th)
char status_char;
if (!(cin >> status_char)) return;
Status[k][i][j] = status_char - '0';
// Tính PrefixSum 3D
PrefixSum[k][i][j] = Status[k][i][j]
- PrefixSum[k-1][i-1][j-1]
+ PrefixSum[k-1][i][j] + PrefixSum[k][i-1][j] + PrefixSum[k][i][j-1]
- PrefixSum[k-1][i-1][j] - PrefixSum[k-1][i][j-1] - PrefixSum[k][i-1][j-1];
}
}
}
// Gọi hàm giải với khối ban đầu [1, 1, 1] đến [X, Y, Z]
cout << solve(1, 1, 1, X, Y, Z) << "\n";
}
int main() {
// Tăng tốc độ I/O
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
if (!(cin >> T)) return 0;
while (T--) {
solve_test_case();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dHVwbGU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gxJDhu4tuaCBuZ2jEqWEga2nhu4N1IGThu68gbGnhu4d1IGNobyBrZXkgY+G7p2EgRFA6ICh4MSwgeTEsIHoxLCB4MiwgeTIsIHoyKQp1c2luZyBTdGF0ZSA9IHR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQ+OwoKLy8gS2hhaSBiw6FvIGR5bmFtaWMgdmVjdG9ycyBjaG8gU3RhdHVzIHbDoCBQcmVmaXhTdW0sIHPhu60gZOG7pW5nIDEtYmFzZWQgaW5kZXhpbmcKdmVjdG9yPHZlY3Rvcjx2ZWN0b3I8aW50Pj4+IFN0YXR1czsKdmVjdG9yPHZlY3Rvcjx2ZWN0b3I8aW50Pj4+IFByZWZpeFN1bTsKCi8vIFPhu60gZOG7pW5nIG1hcCBjaG8gTWVtb2l6YXRpb24gKERQIHRhYmxlKQptYXA8U3RhdGUsIGludD4gRFA7CgppbnQgWCwgWSwgWjsKCi8qKgogKiBAYnJpZWYgVMOtbmggc+G7kSBraOG7kWkgJzEnIHRyb25nIGto4buRaSBjb24gW3gxLCB5MSwgejFdIMSR4bq/biBbeDIsIHkyLCB6Ml0gKDEtYmFzZWQgaW5kZXgpCiAqLwppbnQgY291bnRfb25lcyhpbnQgeDEsIGludCB5MSwgaW50IHoxLCBpbnQgeDIsIGludCB5MiwgaW50IHoyKSB7CiAgICBpZiAoeDEgPiB4MiB8fCB5MSA+IHkyIHx8IHoxID4gejIpIHJldHVybiAwOwogICAgCiAgICAvLyBT4butIGThu6VuZyBQcmVmaXhTdW0gM0QgduG7m2kgbmd1ecOqbiB04bqvYyBsb+G6oWkgdHLhu6stYmFvIGjDoG0KICAgIGludCByZXMgPSBQcmVmaXhTdW1beDJdW3kyXVt6Ml07CiAgICAKICAgIC8vIDEgbOG6p24gdHLhu6sKICAgIHJlcyAtPSBQcmVmaXhTdW1beDEtMV1beTJdW3oyXSArIFByZWZpeFN1bVt4Ml1beTEtMV1bejJdICsgUHJlZml4U3VtW3gyXVt5Ml1bejEtMV07CiAgICAKICAgIC8vIDIgbOG6p24gdHLhu6sgKGPhuqduIGPhu5luZyBs4bqhaSkKICAgIHJlcyArPSBQcmVmaXhTdW1beDEtMV1beTEtMV1bejJdICsgUHJlZml4U3VtW3gxLTFdW3kyXVt6MS0xXSArIFByZWZpeFN1bVt4Ml1beTEtMV1bejEtMV07CiAgICAKICAgIC8vIDMgbOG6p24gdHLhu6sgKGPhuqduIHRy4burIMSRaSkKICAgIHJlcyAtPSBQcmVmaXhTdW1beDEtMV1beTEtMV1bejEtMV07CiAgICAKICAgIHJldHVybiByZXM7Cn0KCi8qKgogKiBAYnJpZWYgSMOgbSBRdXkgaG/huqFjaCDEkeG7mW5nICg2RCBEUCkgdMOsbSBjaGkgcGjDrSB04buRaSB0aGnhu4N1IMSR4buDIHBo4bunIGto4buRaSBjb24uCiAqLwppbnQgc29sdmUoaW50IHgxLCBpbnQgeTEsIGludCB6MSwgaW50IHgyLCBpbnQgeTIsIGludCB6MikgewogICAgLy8gMS4gVHLGsOG7nW5nIGjhu6NwIEPGoSBz4bufOiBLaOG7kWkga2jDtG5nIGPDsyBraOG7kWkgMSBuw6BvCiAgICBpZiAoY291bnRfb25lcyh4MSwgeTEsIHoxLCB4MiwgeTIsIHoyKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8vIDIuIE1lbW9pemF0aW9uCiAgICBTdGF0ZSBjdXJyZW50X3N0YXRlID0ge3gxLCB5MSwgejEsIHgyLCB5MiwgejJ9OwogICAgaWYgKERQLmNvdW50KGN1cnJlbnRfc3RhdGUpKSB7CiAgICAgICAgcmV0dXJuIERQW2N1cnJlbnRfc3RhdGVdOwogICAgfQoKICAgIC8vIDMuIFTDrW5oIENoaSBwaMOtIFThu5FpIHRoaeG7g3UKICAgIAogICAgaW50IGR4ID0geDIgLSB4MSArIDE7CiAgICBpbnQgZHkgPSB5MiAtIHkxICsgMTsKICAgIGludCBkeiA9IHoyIC0gejEgKyAxOwogICAgCiAgICAvLyBM4buxYSBjaOG7jW4gMTogUGjhu6cgYuG6sW5nIG3hu5l0IGto4buRaSAoU2luZ2xlIENvdmVyKQogICAgLy8gQ2hpIHBow60gPSBtaW4oZHgsIGR5LCBkeikKICAgIGludCBtaW5fY29zdCA9IG1pbih7ZHgsIGR5LCBken0pOwoKICAgIC8vIEzhu7FhIGNo4buNbiAyOiBUw6FjaCAoU3BsaXQpCiAgICAKICAgIC8vIFTDoWNoIGThu41jIHRoZW8gWAogICAgZm9yIChpbnQgeCA9IHgxOyB4IDwgeDI7ICsreCkgewogICAgICAgIC8vIFTDoWNoIHRow6BuaCBbeDEuLnhdIHbDoCBbeCsxLi54Ml0KICAgICAgICBtaW5fY29zdCA9IG1pbihtaW5fY29zdCwgc29sdmUoeDEsIHkxLCB6MSwgeCwgeTIsIHoyKSArIHNvbHZlKHggKyAxLCB5MSwgejEsIHgyLCB5MiwgejIpKTsKICAgIH0KCiAgICAvLyBUw6FjaCBk4buNYyB0aGVvIFkKICAgIGZvciAoaW50IHkgPSB5MTsgeSA8IHkyOyArK3kpIHsKICAgICAgICAvLyBUw6FjaCB0aMOgbmggW3kxLi55XSB2w6AgW3krMS4ueTJdCiAgICAgICAgbWluX2Nvc3QgPSBtaW4obWluX2Nvc3QsIHNvbHZlKHgxLCB5MSwgejEsIHgyLCB5LCB6MikgKyBzb2x2ZSh4MSwgeSArIDEsIHoxLCB4MiwgeTIsIHoyKSk7CiAgICB9CgogICAgLy8gVMOhY2ggZOG7jWMgdGhlbyBaCiAgICBmb3IgKGludCB6ID0gejE7IHogPCB6MjsgKyt6KSB7CiAgICAgICAgLy8gVMOhY2ggdGjDoG5oIFt6MS4uel0gdsOgIFt6KzEuLnoyXQogICAgICAgIG1pbl9jb3N0ID0gbWluKG1pbl9jb3N0LCBzb2x2ZSh4MSwgeTEsIHoxLCB4MiwgeTIsIHopICsgc29sdmUoeDEsIHkxLCB6ICsgMSwgeDIsIHkyLCB6MikpOwogICAgfQoKICAgIC8vIEzGsHUga+G6v3QgcXXhuqMgdsOgIHRy4bqjIHbhu4EKICAgIHJldHVybiBEUFtjdXJyZW50X3N0YXRlXSA9IG1pbl9jb3N0Owp9Cgp2b2lkIHNvbHZlX3Rlc3RfY2FzZSgpIHsKICAgIGlmICghKGNpbiA+PiBYID4+IFkgPj4gWikpIHJldHVybjsKCiAgICAvLyBSZXNldCBEUCBtYXAKICAgIERQLmNsZWFyKCk7CgogICAgLy8gS2jhu59pIHThuqFvIGR5bmFtaWMgdmVjdG9ycyB24bubaSBrw61jaCB0aMaw4bubYyBYKzEsIFkrMSwgWisxIGNobyAxLWJhc2VkIGluZGV4aW5nCiAgICBTdGF0dXMuYXNzaWduKFggKyAxLCB2ZWN0b3I8dmVjdG9yPGludD4+KFkgKyAxLCB2ZWN0b3I8aW50PihaICsgMSwgMCkpKTsKICAgIFByZWZpeFN1bS5hc3NpZ24oWCArIDEsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4oWSArIDEsIHZlY3RvcjxpbnQ+KFogKyAxLCAwKSkpOwoKICAgIC8vIMSQ4buNYyBJbnB1dCB2w6AgeMOieSBk4buxbmcgUHJlZml4U3VtCiAgICBmb3IgKGludCBrID0gMTsgayA8PSBYOyArK2spIHsgLy8gWC1jb29yZGluYXRlIChNYSB0cuG6rW4gay10aCkKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBZOyArK2kpIHsgLy8gWS1jb29yZGluYXRlIChIw6BuZyBpLXRoKQogICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBaOyArK2opIHsgLy8gWi1jb29yZGluYXRlIChD4buZdCBqLXRoKQogICAgICAgICAgICAgICAgY2hhciBzdGF0dXNfY2hhcjsKICAgICAgICAgICAgICAgIGlmICghKGNpbiA+PiBzdGF0dXNfY2hhcikpIHJldHVybjsKICAgICAgICAgICAgICAgIFN0YXR1c1trXVtpXVtqXSA9IHN0YXR1c19jaGFyIC0gJzAnOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBUw61uaCBQcmVmaXhTdW0gM0QKICAgICAgICAgICAgICAgIFByZWZpeFN1bVtrXVtpXVtqXSA9IFN0YXR1c1trXVtpXVtqXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFByZWZpeFN1bVtrLTFdW2ktMV1bai0xXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFByZWZpeFN1bVtrLTFdW2ldW2pdICsgUHJlZml4U3VtW2tdW2ktMV1bal0gKyBQcmVmaXhTdW1ba11baV1bai0xXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFByZWZpeFN1bVtrLTFdW2ktMV1bal0gLSBQcmVmaXhTdW1bay0xXVtpXVtqLTFdIC0gUHJlZml4U3VtW2tdW2ktMV1bai0xXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gR+G7jWkgaMOgbSBnaeG6o2kgduG7m2kga2jhu5FpIGJhbiDEkeG6p3UgWzEsIDEsIDFdIMSR4bq/biBbWCwgWSwgWl0KICAgIGNvdXQgPDwgc29sdmUoMSwgMSwgMSwgWCwgWSwgWikgPDwgIlxuIjsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBUxINuZyB04buRYyDEkeG7mSBJL08KICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKCiAgICBpbnQgVDsKICAgIGlmICghKGNpbiA+PiBUKSkgcmV0dXJuIDA7CgogICAgd2hpbGUgKFQtLSkgewogICAgICAgIHNvbHZlX3Rlc3RfY2FzZSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9