首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

NYOJ 蛇形填數:方陣與三角形模擬實作

     編輯:C++ 入門

題目一:方陣蛇形填數

在 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;
}

總結

兩題本質皆為「矩陣/三角形走迷宮模擬」,關鍵在於正確定義邊界條件與方向轉換順序。方陣從右上角起步,三角形從左上角起步,方向循環邏輯一致,屬於基礎模擬必練題型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved