SSL 1069
题目描述
设有有2^n(n<=6)个球队进行单循环比赛,计划在2^n–1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2^n-1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
第一行表示参赛的队的编号,第i(i>1)行第j列表示第i-1天与i队的比赛的队的编号!
分析:
1、可以看出这是一个对称(半对称?)的方阵,所以可以用分治解决。
2、可以看出,每个同边长的方阵之间有一个奇异的递增序列:越靠前越小,每往后一点就会每个点都加该方阵的边长。
1,2
2,1
进行复制(讲述第二点)
1,2,3(1+2),4(2+2)
2,1,4(2+2),3(1+1)
var
m,i,j,size,k:longint;
a:array[1..100,1..100]of longint;
begin
readln(m);//读入
size:=1;//初始化
a[1,1]:=1;
while k<m do//判断分治的模块是否超过所需
begin
for i:=1 to size do//将这一个方阵输入完毕
for j:=1 to size do
a[i,j+size]:=a[i,j]+size;
for i:=1 to size do//镜像(为旁边的方阵加值)
for j:=1 to size do
begin
a[i+size,j]:=a[i,j+size];
a[i+size,j+size]:=a[i,j];
end;
inc(size,size);
inc(k);
end;
k:=1;
for i:=1 to m do k:=k*2;
for i:=1 to k do//输出
begin
for j:=1 to k do
write(a[i,j]);
writeln;
end;
end.
点赞不谢~