【問題描述】
設有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 }