日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分治法之循环赛日程表

發布時間:2025/3/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治法之循环赛日程表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描寫敘述:
? ? ? ? ? ? 設有n(n = 2^k)位選手參加網球循環賽,循環賽共進行n-1天,每位選手要與
? ? ? ? 其它n-1位選手比賽一場,且每位選手每天必須比賽一場,不能輪空。試按此要求
? ? ? ? 為比賽安排日程。


? ? 編程思想:
? ? ? ? ? ? 如果n位選手被順序編號為1,2,3,...,n,比賽的日程表是一個n行n-1列的表格,
? ? ? ? i行j列的表格內容是第i號選手在第j天的比賽對手。
? ? ? ? ? ? 依據分而治之的原則,可從當中一半選手(2^(n-1位)的比賽日程,導出全體n位
? ? ? ? 選手的日程,終于細分到僅僅有兩位選手的比賽日程出發。
? ? ? ? ? ? 可如果僅僅有8位選手參賽,若1至4號選手之間的比賽日程填在日程表的左上角
? ? ? ? (4行3列),5至8號選手之間的比賽日程填在日程表的左下角(4行3列);那么左下角的
? ? ? ? 內容可由左上角的相應項加上數字4得到。至此,剩余的右上角(4行4列)是為編號小的
? ? ? ? 1至4號選手與編號大的5至8號選手之間的比賽日程安排。比如,在第4天,讓1至4號選
? ? ? ? 手分別與5至8號選手比賽,以后各天,依次由前一天的日程安排,讓5至8號選手“循環
? ? ? ? 輪轉”就可以。
? ? ? ? 最后,比賽日程表的右下角的比賽日程表可由,右上角的相應項減去數字
? ? ? ? 4得到。
? ? 編程圖例:
? ? ? ??
? ? ===================================================================
? ? |*| 選手 ? ?1天 ? ? ? ?2天 ? ? ? ?3天 ? ? ? ?4天 ? ? ? ?5天 ? ? ? ?6天 ? ? ? ?7天 ? ?|*|
? ? ===================================================================
? ? |*| ? ?1號 ? ?| ? ?2 ? ?| ? ?3 ? ?| ? ?4 ? ?|| ? ?5 ? ?| ? ?6 ? ?| ? ?7 ? ?| ? ?8 ? ?|*|
? ? |*| ? ?2號 ? ?| ? ?1 ? ?| ? ?4 ? ?| ? ?3 ? ?|| ? ?6 ? ?| ? ?7 ? ?| ? ?8 ? ?| ? ?7 ? ?|*|
? ? |*| ? ?3號 ? ?| ? ?4 ? ?| ? ?1 ? ?| ? ?2 ? ?|| ? ?7 ? ?| ? ?8 ? ?| ? ?5 ? ?| ? ?6 ? ?|*|
? ? |*| ? ?4號 ? ?| ? ?3 ? ?| ? ?2 ? ?| ? ?1 ? ?|| ? ?8 ? ?| ? ?5 ? ?| ? ?6 ? ?| ? ?5 ? ?|*|
? ? ========[左上角]========================[右上角]===================
? ? |*| ? ?5號 ? ?| ? ?6 ? ?| ? ?7 ? ?| ? ?8 ? ?|| ? ?1 ? ?| ? ?4 ? ?| ? ?3 ? ?| ? ?2 ? ?|*|
? ? |*| ? ?6號 ? ?| ? ?5 ? ?| ? ?8 ? ?| ? ?7 ? ?|| ? ?2 ? ?| ? ?1 ? ?| ? ?4 ? ?| ? ?3 ? ?|*|
? ? |*| ? ?7號 ? ?| ? ?8 ? ?| ? ?5 ? ?| ? ?6 ? ?|| ? ?3 ? ?| ? ?2 ? ?| ? ?1 ? ?| ? ?4 ? ?|*|
? ? |*| ? ?8號 ? ?| ? ?7 ? ?| ? ?6 ? ?| ? ?5 ? ?|| ? ?4 ? ?| ? ?3 ? ?| ? ?2 ? ?| ? ?1 ? ?|*|

? ? ========[左下角]========================[右下角]===================

#define MAXN 64 //日程表數組 int calendar[MAXN + 1][MAXN]; void Round_Robin_Calendar() {int i,j,m,number,p,q;printf("輸入選手個數:(注意:2^k) ");scanf("%d",&number);//預置兩位選手的比賽日程表://第i位選手第j天與第calendar[i][j]位選手比賽calendar[1][1] = 2; //第1位選手第1天與第2位選手比賽calendar[2][1] = 1; //第2位選手第1天與第1位選手比賽m = 1;p = 1;while(m < number){m ++;//p = p + p;p += p;q = 2 * p; //為2^m位選手安排比賽日程//填充日程表的左下角for(i = p + 1;i <= q;i++)for(j = 1;j<= p - 1;j++)calendar[i][j] = calendar[i - p][j] + p; //左下角的內容 = 左上角的相應項加上數字4[]//填充日程表的右上角//填充日程表的右上角的第1列calendar[1][p] = p + 1; for(i = 2;i <= p;i++)calendar[i][p] = calendar[i - 1][p] + 1;//填充日程表的右上角的其它列,參照前一列填充當前列[循環輪轉算法]for(j = p + 1;j < q;j++){for(i = 1;i < p;i++)calendar[i][j] = calendar[i + 1][j - 1];calendar[p][j] = calendar[1][j - 1];}//填充日程表的右下角for(j = p;j < q;j++)for(i = 1;i <= p;i++)calendar[calendar[i][j]][j] = i; //關鍵語句for(i = 1;i <= q;i++){for(j = 1;j < q;j++)printf("%4d",calendar[i][j]);printf(" ");}printf(" ");} } //:====================“循環賽日程安排”問題的分而治之解決算法====================int main(int argc, char* argv[]) {Round_Robin_Calendar();printf(" 應用程序執行結束! ");return 0; }



轉載于:https://www.cnblogs.com/blfshiye/p/4369001.html

總結

以上是生活随笔為你收集整理的分治法之循环赛日程表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。