在 n×n 矩陣中填入 1..n²,呈順時針螺旋(從右上角開始向下、左、上、右)。
模擬策略:維護當前座標 (x,y),按「下→左→上→右」循環,嘗試前進,若越界或已填則換方向。
int data[110][110];
int main() {
int n; while(cin >> n) {
memset(data, 0, sizeof(data));
int x = 0, y = n-1, cnt = 1;
data[x][y] = cnt;
while (cnt < n*n) {
while (x+1 < n && !data[x+1][y]) data[++x][y] = ++cnt; // 下
while (y-1 >= 0 && !data[x][y-1]) data[x][--y] = ++cnt; // 左
while (x-1 >= 0 && !data[x-1][y]) data[--x][y] = ++cnt; // 上
while (y+1 < n && !data[x][y+1]) data[x][++y] = ++cnt; // 右
}
// 輸出矩陣
}
return 0;
}
邊長 X 的等腰直角三角形(共 X(X+1)/2 格),按「右→左下斜向上→上」循環填入 1..總數。
座標系:(0,0) 為左上角,第 i 行有 X-i 個格子(j 從 0 到 X-i-1)。
int data[1010][1010];
int main() {
int T; cin >> T;
while (T--) {
int len; cin >> len;
memset(data, 0, sizeof(data));
int x = 0, y = 0, cnt = 1, total = len*(len+1)/2;
data[x][y] = cnt;
while (cnt < total) {
while (y+1 < len-x && !data[x][y+1]) data[x][++y] = ++cnt; // 右
while (x+1 < len && y-1 >= 0 && !data[x+1][y-1]) data[++x][--y] = ++cnt; // 斜向左下
while (x-1 >= 0 && !data[x-1][y]) data[--x][y] = ++cnt; // 上
}
// 輸出三角形:第 i 行輸出 data[i][0..len-i-1]
}
return 0;
}
兩題本質皆為「矩陣/三角形走迷宮模擬」,關鍵在於正確定義邊界條件與方向轉換順序。方陣從右上角起步,三角形從左上角起步,方向循環邏輯一致,屬於基礎模擬必練題型。