信息奥赛一本通(1325:【例7.4】 循环比赛日程表)
1325:【例7.4】 循環比賽日程表
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 6257 ??? 通過數: 3483
【題目描述】
設有N個選手進行循環比賽,其中N=2^M,要求每名選手要與其他N?1名選手都賽一次,每名選手每天比賽一次,循環賽共進行N?1天,要求每天沒有選手輪空。
【輸入】
輸入:M。
【輸出】
輸出:表格形式的比賽安排表。一行各數據間用一個空格隔開。
【輸入樣例】
3【輸出樣例】
1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1【問題分析】
? ? ? ? 以m=3(即 n=2^3=8)為例,可以根據問題要求,制定出如下表所示的一種方案∶
? ? ? ? 以表格的中心為拆分點,將表格分成 A、B、C、D 四個部分,就很容易看出有 A=D,B= C,并且這一規律同樣適用于各個更小的部分。
? ? ? ? 設有n個選手的循環比賽,其中 n=2^m,要求每名選手要與其他n-1名選手都賽一次。每名選手每天比賽一次,循環賽共進行 n-1天。要求每天沒有選手輪空,以下是八名選手時的循環比賽表,表中第一行為八位選手的編號,下面七行依次是每位選手每天的對手。
【算法分析】
? ? ? ? 從八位選手的循環比賽表中可以看出,這是一個具有對稱性的方陣,可以把方陣一分為四來看,那么左上角的 4×4 的方陣就是前四位選手的循環比賽表,而右上角的 4*4 的方陣就是后四位選手的循環比賽表,它們在本質上是一樣的,都是4 個選手的循環比賽表,所不同的只是選手編號不同而已,將左上角中方陣的所有元素加上 4 就能得到右上角的方陣。下方的兩個方陣表示前四位選手和后四位選手進行交義循環比賽的情況,同樣具有對稱性,將右上角方陣復制到左下角即得到1、2、3、4 四位選手和 5、6、7、8 四位選手的循環比賽表,根據對稱性,右下角的方陣應與左上角的方陣相同。這樣,八名選手的循環比賽表可以由四名選手的循環比賽表根據對稱性生成出來.同樣地,四名選手的循環比賽表可以由二名選手的循環比賽表根據對稱性生成出來,而兩名選手的循環比賽表可以說是已知的,這種程序設計方法叫做分治法,其基本思想是把一個規模為 n 的問題分成若干個規模較小的問題,使得從這些較小問題的解易于構造出整個問題的解。
程序中用數組 matchlist 記錄 n 名選手的循環比賽表,整個循環比賽表從最初的 1*1的方陣按上述規則生成出2*2 的方陣,再生成出 4*4 的方陣,…,直到生成出整個循環比賽表為止。變量half表示當前方陣的大小,也是要生成的下—個方陣的大小的一半。
【參考代碼】
#include<stdio.h> #define MAXN 1025int matchlist[MAXN][MAXN]; int m;int main() {int i,j,n,k=1,half=1;scanf("%d",&m);// 1<<m 相當手2^mn=1<<m;matchlist[0][0]=1;while(k<=m) //構造右上方方陣{for(i=0;i<half;i++)for(j=0;j<half;j++)matchlist[i][j+half]=matchlist[i][j]+half;for(i=0;i<half;i++) //對稱交換構造下半部分方陣for(j=0;j<half;j++){matchlist[i+half][j]=matchlist[i][j+half]; //左下方方降等于右上方方陣matchlist[i+half][j+half]=matchlist[i][j]; //右下方方降等于左上方方陣}half*=2;k++;} for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",matchlist[i][j]);printf("\n");}return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1325
總結
以上是生活随笔為你收集整理的信息奥赛一本通(1325:【例7.4】 循环比赛日程表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1238:一元三次方程
- 下一篇: 信息学奥赛一本通 1146:判断字符串是