题目:
题目描述
设有N个选手进行循环比赛,其中N=2^M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。
输入输出格式
输入格式:
输入:M
输出格式:
输出:表格形式的比赛安排表
输入输出样例
输入样例#1:
3
输出样例#1:
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
思路:
分治,初始化第一列,以后每次都左下角的方阵等于右上角,右下角等于左上角。
注意输出格式:%2d
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int f[1024][1024];
void dfs(int x,int y,int num) {
if(num==1) {
return ;
}
dfs(x,y,num/2);
dfs(x+num/2,y,num/2);
for(int i=0; i<num/2; i++) {
for(int j=0; j<num/2; j++) {
f[x+num/2+i][y+num/2+j] =f[x+i][y+j];
f[x+i][y+num/2+j] =f[x+num/2+i][y+j];
}
}
}
int main() {
scanf("%d",&n);
m=(1<<n);
for(int i=0; i<m; i++) f[i][0]=i+1;
dfs(0,0,m);
for(int i=0; i<m; i++) {
for(int j=0; j<m; j++) {
printf("%3d",f[i][j]);
}
printf("\n");
}
return 0;
}