循環比賽日程表(match)(分治)


【問題描述】
    設有N個選手進行循環比賽,其中N=2M,要求每名選手要與其他N-1名選手都賽一次,每名選手每天比賽一次,循環賽共進行N-1天,要求每天沒有選手輪空。
    輸入:M
    輸出:表格形式的比賽安排表
【樣例輸入】 match.in
    3
【樣例輸出】 match.out
    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
 當見到是2的幾次方時,就要有分治的意思,因為2的幾次方可以無限地被2分,如樣例,8個人在一起打安排賽事。前4個人在一起打安排賽事和后四個個人安排賽事,
本質上都是4個人一起打,只是他們的編號不同;可以這樣想:把8個人分成兩個賽區,各個賽區相互打完后再交換過來打,同樣,分成的兩個賽區,又可以重新分成若干賽區
,再互相打‘’‘’‘

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 int n,half=1,k=1;
 6 int pic[100][100];
 7 int main()
 8 {
 9     scanf("%d",&n);
10     pic[0][0]=1;//從大小為1的方陣開始生成 
11     int m=1<<n;//相當於2的n次方 
12     do
13     {
14         for(int i=0;i<half;i++)
15         {
16             for(int j=0;j<half;j++)
17             {
18                 pic[i][j+half]=pic[i][j]+half;//生成右上 
19             }
20         }
21         for(int i=0;i<half;i++)
22         {
23             for(int j=0;j<half;j++)
24             {
25                 pic[i+half][j]=pic[i][j+half];//左下,由右上復制 
26                 pic[i+half][j+half]=pic[i][j];//右下,由左下復制 
27             }
28         }
29         half*=2;//當前的方陣大小 
30         k++;//生成次數+1,2的3次方就重復做3次 
31     }while(k<=n); 
32     for(int i=0;i<m;i++)
33     {
34         for(int j=0;j<m;j++)
35         {
36             printf("%d",pic[i][j]);
37         }
38         cout<<endl;
39     }
40     return 0;
41 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM