1243.循环赛日程表
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
用分治算法生成循环赛日程表(1到2的n次方个人)
#include <iostream>
using namespace std;
int a[10000][10000];
int n;
void search(int start,int length);
void filltable(int start,int length);
int main()
{
cin>>n;
int k;
int length=1;
for(k=0;k<n;k++)
length*=2;
int i,j;
for(i=1;i<=length;i++)
a[i][1]=i;
search(1,length);
for(i=1;i<=length;i++){
for(j=1;j<=length;j++){
cout<<a[i][j];
if(j!=length)
cout<<" ";
}
cout<<endl;
}
return 0;
}
void search(int start,int length)
{
if(length==2){
a[start+1][2]=a[start][1]; //сроб
a[start][2]=a[start+1][1]; //срио
}
else{
int len=length/2;
search(start,len);
search(start+len,len);
filltable(start,length);
}
}
void filltable(int start,int length)
{
int i,j;
int len=length/2;
for(i=start;i<start+len;i++) //сроб
for(j=1;j<=len;j++)
a[i+len][j+len]=a[i][j];
for(i=start+len;i<start+len*2;i++) //срио
for(j=1;j<=len;j++)
a[i-len][j+len]=a[i][j];
}