问题描述:有n个运动员进行循环赛,要求设计满足一下要求的日程表
1、
2、
3、
分析:方格可以分成4部分,左上和右下一样,左下和右上一样;左下=左上+(1<<k);对k循环即可。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 14; //最大的k值,对应的选手个数为 (1<<k)
int table[1<<maxn][1<<maxn]; //最大表,4*256M
int main()
{
int k, kase = 0;
while(~scanf("%d",&k)) {
if(kase) putchar('\n');
printf("Case #%d: \n", ++kase);
//memset(table, 0, sizeof(table));
table[0][0] = 1;
for(int i=0; i<k; i++) {
int n = 1<<i;
for(int j=0; j<n; j++) {
for(int t=0; t<n; t++) {
table[j+n][t] = table[j][t+n] = table[j][t] + n;
table[j+n][t+n] = table[j][t];
}
}
}
int n = 1<<k;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
printf("%4d", table[i][j]);
}
putchar('\n');
}
}
return 0;
}