開啟章節選單
3D 停車場
題目說明
這是一題三維空間尋找最近距離的題目。與二維的平面停車場題目概念相似,只是增加一個立體維度,讓程式碼變得更加長而已,實際上概念仍只需依照題目敘述撰寫即可。
解題過程
第一步一樣是依照題意讀入資料。X
、 Y
和 Z
為整個停車場的三維空間大小,q
為查詢數量。
int X, Y, Z; cin >> X >> Y >> Z; int q; cin >> q;
接著在 main
函式外開一個三維陣列用來儲存是否有車輛已經停入。
bool park[55][55][55];
對於接下來的 q
筆查詢,我們需要先讀取輸入,接著在建立一個函式來判斷與空位停車格相距多遠。
int X, Y, Z; cin >> X >> Y >> Z; int q; cin >> q;
自訂函式透過獲取兩個不同的座標,並使用 abs()
函式取絕對值。
int dis(int x1, int y1, int z1, int x2, int y2, int z2) { return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); }
接下來的 q
次查詢我們使用 while
迴圈來遍歷。在每一次運算中,我們會檢查使用者想去的位置是否有東西了。在過往二維陣列我們已經使用過兩層的巢狀迴圈,這次三維陣列即使用三層迴圈。
while (q--) { // 讀入車子進入點 int x, y, z; cin >> x >> y >> z; int mx = -1, my = -1, mz = -1; // 遍歷整個停車場 for (int i = 1; i <= X; i++) { for (int j = 1; j <= Y; j++) { for (int k = 1; k <= Z; k++) { // 如果這個車位已經被停過就跳過 if (park[i][j][k]) continue; // 該車位到進入的位置的距離 int dist = dis(i, j, k, x, y, z); // 目前最近的車位的距離 int mind = dis(mx, my, mz, x, y, z); // 找到更適合停的位置 if (dist < mind || mx == -1) { mx = i; my = j; mz = k; } } } } }
在確定車要停的位置後,我們只需要依據題目做最後的處理。先將座標軸輸出,然後陣列中停的位置更新成 True
。
park[mx][my][mz] = true; cout << mx << " " << my << " " << mz << endl;
解題成果
#include <iostream> using namespace std; bool park[55][55][55]; int dis(int x1, int y1, int z1, int x2, int y2, int z2) { return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); } int main() { int X, Y, Z; cin >> X >> Y >> Z; int q; cin >> q; while (q--) { int x, y, z; cin >> x >> y >> z; int mx = -1, my = -1, mz = -1; for (int i = 1; i <= X; i++) { for (int j = 1; j <= Y; j++) { for (int k = 1; k <= Z; k++) { if (park[i][j][k]) continue; int dist = dis(i, j, k, x, y, z); int mind = dis(mx, my, mz, x, y, z); if (dist < mind || mx == -1) { mx = i; my = j; mz = k; } } } } park[mx][my][mz] = true; cout << mx << " " << my << " " << mz << endl; } }