题目:
设有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;
}
拜拜!!!