1243.循环赛日程表
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
用分治算法生成循环赛日程表(1到2的n次方个人)
输入
一个小于等于7的正整数n
输出
循环赛日程表(1到2的n次方个人)
输入样例
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
#include<iostream>
#include<math.h>
using namespace std;
int a[150][150]={0};
void Plan(int k)
{
int i,j,t,n=2,temp;
a[1][1]=1;
a[1][2]=2;
a[2][1]=2;
a[2][2]=1;
for(t=1;t<k;t++)
{
temp=n;
n=n*2;
//左下角
for(i=temp+1;i<=n;i++)
for(j=1;j<=temp;j++)
a[i][j]=a[i-temp][j]+temp;
//右上角
for(i=1;i<=temp;i++)
for(j=temp+1;j<=n;j++)
a[i][j]=a[i+temp][(j+temp)%n];
//右下角
for(i=temp+1;i<=n;i++)
for(j=temp+1;j<=n;j++)
a[i][j]=a[i-temp][j-temp];
}
}
int main()
{
int n,k,i,j;
cin>>n;
k=1<<n;
Plan(n);
for(i=1;i<=k;i++)
{
for(j=1;j<=k;j++)
{
cout<<a[i][j];
if(j==k) cout<<endl;
else cout<<" ";
}
}
return 0;
}