分治 循环比赛日程表

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.

点赞不谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值