分治算法 循环比赛日程表

分治算法 循环比赛日程表

题目:

设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。

解析:

看完这道题的童鞋们

肯定不知道这题为何是分支

其实呀

给童鞋们

看一下

输出出来的表格就知道了
在这里插入图片描述
这个表格

可以分成4份

左上角的那份

和右下角相同

右上角的那份

和左下角相同

每个小份

可以再分成4份

每个右上角块数值=左上角块+每一块的边长

同上

思路:

先将a[1][1]

赋值为1

a[1][1]就是第一个左上角

接着再通过第一个左上角

造出第一个右上角

再通过赋值的方式

就把四个角都赋值好了

再把这个方块

作为一个左上角

同上

代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int m,n,a[1000][1000],l;
int main()
{
	freopen("bs.in","r",stdin);
	freopen("bs.out","w",stdout);
	cin>>m;
	n=pow(2,m);
    a[1][1]=1; 
	for(int k=0;k<m;k++)
	  {
	    l=pow(2,k);
		for(int i=1;i<=l;i++)//先造出右上角的数据 
	      for(int j=1;j<=l;j++)
	        a[i][j+l]=a[i][j]+l;
	    for(int i=1;i<=l;i++)//左上角的数据与右下角的数据相同 
	      for(int j=1;j<=l;j++)
	        a[i+l][j+l]=a[i][j];
	    for(int i=1;i<=l;i++)//右上角的数据与左下角的数据相同 
	      for(int j=1;j<=l;j++)
	        a[i+l][j]=a[i][j+l];
	  }
    for(int i=1;i<=n;i++)
	  {
		for(int j=1;j<=n;j++)
		cout<<a[i][j]<<" ";
		cout<<endl;
	  }
	fclose(stdin);
	fclose(stdout);
	return 0;
}

拜拜!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值