循环比赛日程表

题目:

题目描述
设有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;
}

猜你喜欢

转载自blog.csdn.net/rabbit_zar/article/details/80885665