安排循环赛

时间:2019-10-03 19:36:42

标签: algorithm

如何为4个元素[1,2,3,4]的数组实施循环调度?算法的结果应该能够按时间顺序显示每个元素将面对的玩家列表:

 (1: 4,2,3)
 (2: 3,1,4) 
 (3: 2,4,1) 
 (4: 1,3,2) 

1: 4,2,3行表示玩家(1)将面对玩家(4),(2)和(3)。

以同样的方式,行2: 3,1,4表示玩家(2)将按玩家(3),(1)和(2)的顺序面对。

我们已经实现了这段代码,但是当我们开始填写播放器的名称时遇到了一个错误。您对这个问题有任何想法吗?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define NAME_MAX_LENGTH 20
    #define NUM_MIN_PLAYERS 2
    #define NUM_MAX_PLAYERS 20

    enum Style
    {
        STYLE_COMPACT,
        STYLE_TABLE
    };

    enum Format
    {
        FORMAT_ID,
        FORMAT_NAME
    };

    struct PlayerList
    {
        unsigned int num_players;
        char name[NUM_MAX_PLAYERS][NAME_MAX_LENGTH + 1];
    };

    struct Grid
    {
        unsigned int num_players;
        unsigned int day[NUM_MAX_PLAYERS]
                        [NUM_MAX_PLAYERS];
    };

    void printList(struct PlayerList *list)
    {
        for (int i = 0; i < list->num_players; i++)
        {
            printf("%d:%s\n", i + 1, list->name[i]);
        }
    }

    struct Grid calculer_berger(struct PlayerList *list)
    {

        struct Grid grid;
        // algo pour remplir la grid
        grid.num_players = list->num_players;
        int i, j;
        for (i = 0; i < list->num_players - 1; i++)
        {
            for (j = 0; j < list->num_players - 1; j++)
            {
                if (i == j)
                {
                    /* edge cases */
                    grid.day[i][list->num_players - 1] = ((i + j) + (i + j) / list->num_players) % list->num_players;
                    grid.day[list->num_players - 1][j] = ((i + j) + (i + j) / list->num_players) % list->num_players;
                    grid.day[i][j] = 0;
                }
                else
                {
                    grid.day[i][j] = ((i + j) + (i + j) / list->num_players) % list->num_players;
                }
            }
        }

        grid.day[0][list->num_players - 1] = list->num_players - 1;
        grid.day[list->num_players - 1][list->num_players - 1] = 0;
        grid.day[list->num_players - 1][0] = list->num_players - 1;
        return grid;
    }

    void permuter(struct Grid *grid)
    {
        int tmp;
        for (int i = 0; i < grid->num_players; i++)
        {
            for (int j = 1; j <= grid->num_players / 2; j++)
            {
                tmp = grid->day[i][j];
                grid->day[i][j] = grid->day[i][grid->num_players - j];
                grid->day[i][grid->num_players - j] = tmp;
            }
        }
    }

    void print_grid(struct Grid *grid, struct PlayerList *list)
    {
        for (int i = 0; i < grid->num_players; i++)
        {
            for (int j = 0; j < grid->num_players; j++)
            {
                if (j == 0)
                {
                    printf("%d:", grid->day[i][j] + 1);
                }
                else
                {
                    printf("%d", grid->day[i][j] + 1);
                    if (j < grid->num_players - 1)
                    {
                        printf(",");
                    }
                }
            }
            printf("\n");
        }
    }

    int main(int argc, char **argv)
    {


        struct PlayerList playerList;
        char nom[NAME_MAX_LENGTH + 1];
        int nbCharLu = 0;

        while ((nbCharLu = fscanf(stdin, "%s", nom)) != -1)
        {
            strcpy(playerList.name[playerList.num_players], nom);
            playerList.num_players++;
        }

        struct Grid myGrid = calculer_berger(&playerList);

        printList(&playerList);

        print_grid(&myGrid, &playerList);
        printf("Apres la permut\n");

        permuter(&myGrid);
        print_grid(&myGrid, &playerList);

        return 0;
    }

2 个答案:

答案 0 :(得分:0)

假设您将元素存储在Integer数组中,并且只想显示结果。 这是一个实现。...由于使用了“ sizeof”,因此代码应容纳“ N”个值。...

随时可以对其进行自定义。...

#include <stdio.h> 

int main() {
  int i,j;
  int array[] = {1,2,3,4};

  for(i = 0; i < sizeof(array)/sizeof(int);++i){
    printf("(%d :",array[i]);
    for(j = 0; j < sizeof(array)/sizeof(int);++j){
      if(j == i)   
        continue;
      printf("%d ",array[j]);
    }
    printf(")\n");
  }
}

答案 1 :(得分:0)

#include <stdio.h> 

void main() {
  int mid;
  int num;
  int j, temp;
  int k = 0;
  int num1;

  int data[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14};

  num = sizeof(data)/sizeof(int);
  mid  = (sizeof(data)/sizeof(int))/2;
  while(k < num - 1){
    printf("Round %d ( ",k+1);
    num1 = num;
    for(int i = 0;i < mid;i++,num1--) /*pairing the competitors in each round*/ 
      printf("%d:%d ",data[i],data[num1-1]);
    for(int i = 0,j = num-1; i < num -2;i++,j--){ /* fixing the first competitor and rotating the others clockwise*/
      temp = data[j];
      data[j] = data[j-1];
      data[j-1] = temp;
    }
    printf(")\n");
    k++;
  }

}