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

循環賽日程表生成:非遞歸迭代法

     編輯:C++ 入門

問題描述

同遞歸版:給定 2ᵏ 名運動員,生成循環賽日程表。此處採用迭代(非遞歸)方式構造。

迭代構造思路

從 2×2 基礎表開始,每次將規模翻倍:

  1. 當前表大小為 s×s(初始 s=2)。
  2. 新表大小 2s×2s,分為四個 s×s 區塊。
  3. 左上、右上保持原樣(右上運動員編號需偏移,但此處代碼直接複製數值)。
  4. 右下 = 複製左上,左下 = 複製右上。
  5. s *= 2,重複直到 s = n。

參考代碼 (C++)

#include 
#include 
using namespace std;

void copyBlock(int** a, int sr, int sc, int dr, int dc, int k) {
    for (int i = 0; i < k; ++i)
        for (int j = 0; j < k; ++j)
            a[dr+i][dc+j] = a[sr+i][sc+j];
}

void buildIter(int** a, int n) {
    for (int s = 2; s <= n; s <<= 1) {
        for (int j = 0; j < n; j += s) {
            copyBlock(a, 0, j, s/2, j + s/2, s/2);     // 左上→右下
            copyBlock(a, 0, j + s/2, s/2, j, s/2);     // 右上→左下
        }
    }
}

int main() {
    int n; cin >> n; // n 應為 2 的冪
    int** table = new int*[n];
    for (int i = 0; i < n; ++i) {
        table[i] = new int[n];
        table[0][i] = table[i][0] = i + 1;
    }
    buildIter(table, n);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) cout << table[i][j] << ' ';
        cout << endl;
    }
    return 0;
}

輸出示例 (n=4)

循環賽日程表非遞歸輸出

複雜度與比較

  • 時間:O(n²),同遞歸版,但無函數調用開銷。
  • 空間:O(n²)。
  • 迭代版更易理解控制流,避免棧溢出風險(雖此處 n 較小)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved