解题思路:根据题目2^k可以考虑尝试分治法,观察k=3时本题的解,可以发现左上角和右下角完全相同,左下角和右上角完全相同,且左下角等于右上角+4,所以我们只需递归左上角部分,接着同时加d/2,再进行复制处理即可得到完整答案。
问题大意:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表:
1)每个选手必须与其它n-1个选手各赛一次;
2)每个选手一天只能赛一次。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int ch[1000][1000];
void design(int d)
{
if(d==1)
{
ch[1][1]=1;
return;
}
design(d/2);
for(int i=d/2+1;i<=d;i++)
{
for(int j=1;j<=d/2;j++)
{
ch[i][j]=ch[i-d/2][j]+d/2;
ch[i][j+d/2]=ch[i-d/2][j];
ch[i-d/2][j+d/2]=ch[i][j];
}
}
}
int main()
{
int t;
while(cin>>t)
{
int pow=1;
while(t--)
{
pow*=2;
}
design(pow);
for(int i=1;i<=pow;i++)
{
for(int j=1;j<=pow;j++)
{
cout<<ch[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
return 0;
}