##大致思路:
- 利用分治法思想,将选手一直划分为人数为2的日程表,则必定为 1 2 2 1
- 通过规律直接复制左下角部分的数据
- 通过规律,将左上角的数据复制到右下角,将左下角的数据复制到右上角
##主函数:
- 定义变量k,定义数组array[N][N]
- 提示用户输入K,并判断合法性,若合法,则调用函数 Gametable(k, array)得到日程表,并调用Play(k, array)输出日程表
##Gametable (…)函数:
- 首先,直接赋值array[1][1]、array[1][2]、array[2][1]、array[2][2]
- 判断k的大小,决定分成几大步制作日程表
- 通过赋值语句array[i][j] = array[i – temp][j] + temp;//左下角和左上角元素的对应关系,左下角元素的数据赋值
- 通过两次大循环,将左下角元素抄到右上角
- 通过两次大循环,将左上角元素抄到右下角
- 判断循环次数是否到达k,若否,则继续按照以上步骤执行
##Play()函数:
- 依次输入二维数据的数据
##关键代码:
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
#define N 100
void Gametable(int k,int array[][N])//生成比赛日程表格
{
int n, temp, i, j, p, t;
n = 2;//当k=0两个参赛选手日程可以直接求得
array[1][1] = 1; array[1][2] = 2;//直接赋值
array[2][1] = 2; array[2][2] = 1;//直接赋值
for (t = 1; t<k; t++)//t指对称赋值的总循环次数,即分成几大步进行制作日程表
{
temp = n;
n = n * 2;
for (i = temp + 1; i <= n; i++)//左下角和左上角赋值的次数
for (j = 1; j <= temp; j++)//每行赋值的次数
array[i][j] = array[i - temp][j] + temp;//左下角和左上角元素的对应关系
for (i = 1; i <= temp; i++)//将左下角元素抄到右上角
for (j = temp + 1; j <= n; j++)
array[i][j] = array[i + temp][j - temp];
for (i = temp + 1; i <= n; i++)//将左上角元素抄到右下角
for (j = temp + 1; j <= n; j++)
array[i][j] = array[i - temp][j - temp];
}
}
void Play(int k,int array[][N])//打印比赛日程表格
{
//0号单元不使用
int i, j;
int n = pow(2, k);//总人数
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
printf("%d ", array[i][j]);
if (j == n)
printf("\n");
}
}
void main()
{
int k;
int array[N][N] = { 0 };//初始化数组 并且不实用array[0][N]和array[N][0]这些元素
while (1)
{
printf("请输入参数K(K>0):\n");
while (scanf("%d", &k) != 1)
{
printf("输入错误,请输入参数K(K>0):\n");
while (getchar() != '\n');//读取缓冲区字符,和fflush功能类似
}
Gametable(k, array);
Play(k, array);
}
}