C++迴圈賽日程表
迴圈賽日程表
- 設計一個滿足以下要求的比賽日程表
- 每個選手必須與其他n-1個選手各賽一次
- 每個選手一天只能賽一次
- 迴圈賽一共進行n-1天
思路:
按分治策略,將所有的選手分為兩半,n個選手比賽日程表就可以通過為n/2個選手設計的比賽日程表來決定。遞迴的使用對選手進行分割,直到只剩下兩個選手時,比賽日程表的制定就變得很簡單。這時只要讓這2個選手進行比賽就可以了。
注意A這裡的也可以繼續分成四個小塊,就是這樣的遞迴思路。
ok,talking is cheap,show me the code
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;
/*
*迴圈賽日程表(遞迴法)
*/
void Copy(int **map, int sr, int sl, int dr, int dl, int k)
{
for (int i = 0; i < k; i++)
{
for (int j = 0; j < k; j++)
{
map[dr + i][dl + j] = map[sr + i][sl + j];
}
}
}
void Table(int **map, int r, int l, int k)
{
if (1 == k)return;
//填充左上角
Table(map, r, l, k / 2);
//填充右上角
Table(map, r, l + (k / 2), k / 2);
//從左上角拷貝到右下角
Copy(map, r, l, r + k / 2, l + k / 2, k / 2);
//從右上角拷貝到左下角
Copy(map, r, l + k / 2, r + k / 2, l, k / 2);
}
int main()
{
int k;
//輸入運動員的人數
cin >> k;
int ** p = new int*[k];
//賽程表初始化
for (int i = 0; i < k; i++)
{
p[i] = new int[k];
p[0][i] = i + 1;
p[i][0] = i + 1;
}
//執行函式
Table(p, 0, 0, k);
//輸出結果
cout << "迴圈賽日程表(遞迴法):" << endl;
for (int i = 0; i < k; i++)
{
copy(p[i], p[i] + k, ostream_iterator<int>(cout, " "));
cout << endl;
}
return 0;
}
轉載自自由不死,是真的強,我看了半天才明白
相關文章
- 迴圈佇列C++實現佇列C++
- C++中的迴圈結構C++
- c/c++線性迴圈佇列C++佇列
- c++類迴圈依賴的問題C++
- C++之for迴圈、範圍for語句探究C++
- for 迴圈與 while 迴圈While
- while迴圈 case迴圈While
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- C++ While 和 For 迴圈:流程控制全解析C++While
- 無限for迴圈(死迴圈)
- C++ 只能指標迴圈引用簡單測試C++指標
- while迴圈以及do while迴圈While
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- if迴圈
- 迴圈
- for迴圈
- if for迴圈
- For 迴圈
- 04流程控制 for迴圈,while迴圈While
- 11C++迴圈結構-for迴圈(1)C++
- for迴圈、break和continue、二重迴圈
- 【基礎題】【for迴圈】二重迴圈
- c/c++ 線性表之雙向迴圈連結串列C++
- c/c++ 線性表之單向迴圈連結串列C++
- Java迴圈Java
- javaScript for迴圈JavaScript
- 事件迴圈事件
- while迴圈While
- pythonfor迴圈Python
- 迴圈群
- javascript迴圈JavaScript
- Kotlin 迴圈Kotlin
- JavaScript for of 迴圈JavaScript
- 迴圈引用
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- scss中迴圈之@for迴圈佈局畫圓CSS
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 迴圈中的非同步&&迴圈中的閉包非同步