循环日程赛问题

 

##大致思路:

  1. 利用分治法思想,将选手一直划分为人数为2的日程表,则必定为 1 2 2 1
  2. 通过规律直接复制左下角部分的数据
  3. 通过规律,将左上角的数据复制到右下角,将左下角的数据复制到右上角

##主函数:

  1. 定义变量k,定义数组array[N][N]
  2. 提示用户输入K,并判断合法性,若合法,则调用函数 Gametable(k, array)得到日程表,并调用Play(k, array)输出日程表

##Gametable (…)函数:

  1. 首先,直接赋值array[1][1]、array[1][2]、array[2][1]、array[2][2]
  2. 判断k的大小,决定分成几大步制作日程表
  3. 通过赋值语句array[i][j] = array[i – temp][j] + temp;//左下角和左上角元素的对应关系,左下角元素的数据赋值
  4. 通过两次大循环,将左下角元素抄到右上角
  5. 通过两次大循环,将左上角元素抄到右下角
  6. 判断循环次数是否到达k,若否,则继续按照以上步骤执行

##Play()函数:

  1. 依次输入二维数据的数据

##关键代码:

#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);
    }

}