三维数组解决问题案例(天梯赛座位分配)

简介: 三维数组解决问题案例(天梯赛座位分配)

三维数组解决问题案例

简介:通过天梯赛座位分配,这个算法题,我们来理解通过2维以上的数组解决算法问题。

/* 天梯赛座位分配 (20 分)

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,

每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后

只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式:

输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式:

从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

输入样例:

3

3 4 2

输出样例:

#1

1 4 7 10 13 16 19 22 25 28 // 稍微观察下就可以看出这个编号的规律,从上往下看

31 34 37 40 43 46 49 52 55 58

61 63 65 67 69 71 73 75 77 79

#2

2 5 8 11 14 17 20 23 26 29

32 35 38 41 44 47 50 53 56 59

62 64 66 68 70 72 74 76 78 80

82 84 86 88 90 92 94 96 98 100

#3

3 6 9 12 15 18 21 24 27 30

33 36 39 42 45 48 51 54 57 60

*/

// 解决方案一(三维数组的应用)

// 对于三维数组的空间结构或者是储存结构的理解:一维数组 int a[i],它是一条线(专业的说是一片连续的储存空间进行存储) ,二维数组 int a[i][j] , 它是由多条线

// 共同组成的一个面(上面题目里面的每个矩阵都是二维数组,每一行都是一个一维数组) ,三维数组就是多个平行的平面(二维数组)组成,当然目前直观的来看只能显示

// 出一维数组和二维数组直观的样子,以此类推四维数组是可以想象成由很多个球构成,每个球里面装着多个三维数组,明白这些以后即使是10位数组都很好理解。

#include<stdio.h>
int main(void)
{
  int n, i, j, k, num = 0, max = 0, lasti = -1;  // n 是高校数目,i, j, k分别是学校的编号,队伍的编号,队伍中每个人的编号, max是存放队伍数量的最大值,lasti是记录是否有两次编号都是同一个学校 
  int a[100][10][10];                            // 这里定义的是一个三维数组 
  int m[100];                    // 这个数字是存放每个学校的队伍数目 
  scanf ("%d", &n);
  for (i = 0; i < n; i++)              // 对每个学校的队伍数目进行输入 
  {
    scanf ("%d", m + i); 
    if (max < m[i])                // 寻找队伍数量的最大值
    {
      max = m[i];
    }
  }
  for (j = 0; j < max; j++)             // 这里的第一个循环变量是队伍编号, 根据题目条件是先把每个学校的最前面的队伍编完后再编写后面的队伍 
  {
    for (k = 0; k < 10; k++)          // 这第二个循环是以每个队伍学生数目为变量, 题目要求每个队伍最多10个人 
    {
      for (i = 0; i < n; i++)         // 第三个循环是以学校的编号为变量,根据题目的例子,第一号在第一个学校,第二号在第二个学校,第三号在第三个学校。。。 
      {                 
        if (j < m[i])             // 这个条件的目的j表示的是当前的队伍编号,m[i] 是这个学校队伍的数量,j从0开始 
        {                 // 先看判断条件之外的语句更好理解这里
          if (lasti == i)           // 这个条件的意思是当两次都是同一个学校的时候表示的就是上面题目中 “只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐” 
          {
            num += 2;         // 然后num每次这次就要+2,跳了一个人 
          }
          else
          {
            num++;            // 反之没有的话就+1 
          }
          a[i][j][k] = num;         // num表示的是当前学生的序号,a[i][j][k], 表示的是当前学生的位置,最开始初始化为0,还没有编号 
          lasti = i;            // lasti表示的就是上一个学生所在的学校编号, 最开始有初始化为-1,不代表任意学校 
        }
      }
    }
  }
  for (i = 0; i < n; i++)             // 输出的时候注意下就好了 
  {
    printf ("#%d\n", i + 1);          // i代表的就是学校编号 
    for (j = 0; j < m[i]; j++)          // 每一队伍 
    {
      for (k = 0; k < 9; k++)         //每个人 
      {
        printf ("%d ", a[i][j][k]);
      }
      printf ("%d\n", a[i][j][k]);
    }
  }
  return 0;
}
相关文章
|
C++
【PTA】​L1-006 连续因子​(C++)
【PTA】​L1-006 连续因子​(C++)
466 0
【PTA】​L1-006 连续因子​(C++)
|
Docker Windows 容器
cpu不支持avx指令集怎么办
如果CPU不支持AVX指令集,可以考虑以下两种解决方案: 更新BIOS版本:在某些情况下,更新BIOS版本可能会支持AVX指令集。可以联系电脑厂商或者查阅相关教程进行BIOS更新。 更换支持AVX指令集的CPU:如果更新BIOS版本后仍不支持AVX指令集,那么可以考虑更换支持AVX指令集的CPU。可以根据自己的需求和预算选择适合的CPU。 另外,如果在tf1.6以后的官方的tf包都是用AVX编译的,而电脑的CPU不支持AVX指令集,那么可以考虑使用Docker来配置运行环境。但需要注意,Docker在Windows上配置稍显繁琐,并需要配置虚拟机等其他东西。 总的来说,如果不支持AVX指令
7699 1
|
大数据 开发者 程序员
连接真实世界,高德地图背后的算法演进和创新
出行是生活的重要部分。我们都习惯了出门用导航,但一个导航App背后,需要什么样的数据和算法来支撑呢?算法又如何来推动出行体验的进步和创新呢?在阿里CIO学院攻“疫”技术公益大咖说的第十四场直播中高德地图首席科学家任小枫将为大家讲解高德地图背后的算法的演进和创新,分别从地图制作、搜索推荐、路径规划、时
11466 1
|
Java Maven
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
该博客文章介绍了如何使用Java Swing中的JFrame创建一个窗体来收集用户输入的内容,并提供了详细的实现步骤和完整代码示例。
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
【qt】 QGridLayout布局管理器怎么用?
【qt】 QGridLayout布局管理器怎么用?
559 0
|
10月前
|
人工智能 自然语言处理 搜索推荐
智能语音助手的发展与未来:开启人机交互的新篇章
智能语音助手的发展与未来:开启人机交互的新篇章
1657 28
|
存储 C++
【PTA】L1-039 古风排版(C++)
【PTA】L1-039 古风排版(C++)
156 1
|
11月前
|
Java 索引
Java“ExceptionInInitializerError”解决
Java中遇到“ExceptionInInitializerError”错误通常是因为静态初始化块或静态变量初始化时发生异常。解决方法包括检查静态代码块中的逻辑错误、确保资源正确加载以及处理可能的空指针异常。
1997 8
|
网络协议 算法
SYN Cookie技术
【8月更文挑战第18天】
454 4
【天梯赛】L1-095 分寝室
输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);同时,每间女寝人数必须都一样,每间男寝人数必须都一样,也就是女生总人数对女寝数取模为0,男生总人数对男寝数取模为0。输入在一行中给出 3 个正整数 n0​、n1​、n,分别对应女生人数、男生人数、寝室数。按题意模拟,因为知道总寝室数为n,所以可以从1~n-1暴力枚举女寝 i 的数量,那么男寝的数量则为 c-i。
260 6