鱼C论坛

 找回密码
 立即注册
查看: 568|回复: 13

[已解决]s1e35汉诺塔动动手比赛问题

[复制链接]
发表于 2023-5-31 17:12:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

//以下个标黄不会
#include <stdio.h>

#define MAX_NUM 64

int schedule[MAX_NUM+1][MAX_NUM+1];

int arrange(int begin, int num);

int arrange(int begin, int num)
{
        int i, j;

        if (num == 2)//当最后arrange函数最后mum==2时按照1 2 2 1 的顺序存储到数组schedule[1][1] schedule[1][2] schedule[2][1] schedule[2][2]的元素中,并return 0;可是二维数组刚开始不应该是[0][0]吗

二维数组的第一个元素不应该是0,0吗为啥这里的1的位置是这个

二维数组的第一个元素不应该是0,0吗为啥这里的1的位置是这个

        {//                   所以[0][x]和[x][0]存放什么捏
                schedule[begin][1] = begin;
                schedule[begin][2] = begin + 1;
                schedule[begin+1][1] = begin + 1;
                schedule[begin+1][2] = begin;
                return 0;
        }

        arrange(begin, num/2);
        arrange(begin + num/2, num/2);
//                                                                               下面四个for函数也不太懂,以及在数组中存放的位置,
        for (i = begin + num/2; i < begin + num; i++)
        {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule[i][j] = schedule[i-num/2][j-num/2];
                }
        }

        for (i = begin; i < begin + num/2; i++)
        {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule[j] = schedule[i+num/2][j-num/2];
                }
        }
}

int main(void)
{
        int num, i, j;

        printf("请输入参赛的队伍数量:");
        scanf("%d", &num);

        // 检查num是否2的N次方
        // 注意,这里是&,不是&&
        // &是按位与操作,1&1==1,0&1==0,0&0 == 0
        if (num & num - 1)
        {
                printf("参数队伍的数量必须是2的N次方!\n");
                return -1;
        }

        arrange(1, num);
//                                这里也不太懂,打印编号的位置,所以这个i是个局部变量?
[/i]
[i][i]        printf("编 号");

        for (i = 1; i < num; i++)
        {
                printf("\t第%d天", i);
        }

        putchar('\n');
//还有这个循环语句什么意思捏
        for (i = 1; i <= num; i++)
        {
                for (j = 1; j <= num; j++)
                {
                        printf("%3d\t", schedule[j]);
                }
                putchar('\n');
        }

        return 0;
}
[/i][/i]
最佳答案
2023-5-31 19:46:13
让我们逐步回答您的每个问题:

1. 二维数组 `schedule` 被定义为 `int schedule[MAX_NUM+1][MAX_NUM+1];`。在 C 语言中,数组是从 0 开始索引的,这意味着第一个元素使用索引 0 而不是 1 进行访问。在这段代码中,数组元素从索引 1 到 `num` 进行访问,所以数组的大小被定义为 `MAX_NUM+1`,以适应这种索引方式。数组中的索引 0 处的元素在这段代码中没有被使用。

2. `arrange` 函数中的四个 `for` 循环用于根据特定的模式重新排列 `schedule` 数组中的元素。让我们逐个解释每个循环的目的:

  • 第一个循环 `for (i = begin + num/2; i < begin + num; i++)` 迭代范围的后半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 迭代 `schedule` 数组的后半部分列。此循环的目的是将范围的前半部分的值(`schedule[i-num/2][j-num/2]`)复制到范围的后半部分(`schedule[j]`)。
  •    第二个循环 `for (i = begin; i < begin + num/2; i++)` 迭代范围的前半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 再次迭代 `schedule` 数组的后半部分列。此循环的目的与第一个循环类似,但是顺序相反。它将范围的后半部分的值(`schedule[i+num/2][j-num/2]`)复制到范围的前半部分(`schedule[j]`)。
  •    这些循环有助于按照特定的模式排列元素,但是在提供的代码中,没有直接清楚地说明具体的模式或代码的目的。没有附加的上下文或注释,很难确定代码的确切模式或目的。


3. `main` 函数中的最后一个 `for` 循环用于打印 `schedule` 数组的内容。它迭代 `schedule` 数组的每一行和每一列,并使用循环内的 `printf` 语句打印相应的值。`printf` 语句 `printf("%3d\t", schedule[j]);` 用于以 3 个字符的宽度打印每个值,后面跟一个制表符(`\t`)。在打印每一行后,打印一个换行符(`\n`)以换行到下一行。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 17:12:45 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-31 17:25:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 17:27:27 | 显示全部楼层

我被威胁了,现在人生安全得不到保障,我今天不能跟他抢最佳答案

评分

参与人数 1荣誉 +5 鱼币 +3 贡献 +3 收起 理由
sfqxx + 5 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 17:56:44 From FishC Mobile | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 17:58:56 | 显示全部楼层
本帖最后由 sfqxx 于 2023-5-31 18:49 编辑

这段代码是一个赛程安排程序,将参赛队伍分成两个组并确定他们之间的对战日程。下面一步一步解释代码中包含的问题:

  • 二维数组`schedule`开头有定义:`int schedule[MAX_NUM+1][MAX_NUM+1];`。这是一个64行×64列的二维整型数组,也就是可以存储64个队伍的所有对战情况。
  • 函数arrange()被定义了两次。第一次是在第4行,声明函数原型;第二次是在第11行,函数实现。函数的作用是递归地将参赛队伍分成两个组,并确定每组之间的对战日程。
  • 第14行的if语句是检查参赛队伍数量是否为2的N次方。判断的方法很巧妙,使用按位与运算符&。如果num和num-1进行按位与运算结果不等于0,则说明num并不是2的N次方。注意需要加上括号才能保证正确性。
  • main()函数从控制台读取参赛队伍数量,并调用arrange()函数分配每组的对战安排。然后,它依次打印一张表格,显示参赛队伍的对战情况。该表格主要分为两部分:第一行是对战日期列标题,“编号”是队伍编号列标题,其余格子列出按行列确定的各个队伍的对战情况。第23行嵌套的for循环是打印所有方格的循环部分,两个for循环将使用printf()函数在屏幕上输出表格。

求最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 18:48:47 | 显示全部楼层
isdkz 发表于 2023-5-31 17:27
我被威胁了,现在人生安全得不到保障,我今天不能跟他抢最佳答案

《威胁》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-31 19:40:13 | 显示全部楼层
sfqxx 发表于 2023-5-31 17:58
这段代码是一个赛程安排程序,将参赛队伍分成两个组并确定他们之间的对战日程。下面一步一步解释代码中包含 ...

哥们,你这回答的不是我要问的啊,标黄部分的疑问啊,
其一为什么二维数组[0][0]部分没有存放东西?其他存放什么?
其二中间四个for函数我知道是干什么的,我是不知道为什么要这样写,还有存放位置
其三最后一个for函数什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 19:41:00 | 显示全部楼层
houqing1999 发表于 2023-5-31 19:40
哥们,你这回答的不是我要问的啊,标黄部分的疑问啊,
其一为什么二维数组[0][0]部分没有存放东西?其他 ...

不好意思,我的 gpt 出问题了,教育一番
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 19:46:13 | 显示全部楼层    本楼为最佳答案   
让我们逐步回答您的每个问题:

1. 二维数组 `schedule` 被定义为 `int schedule[MAX_NUM+1][MAX_NUM+1];`。在 C 语言中,数组是从 0 开始索引的,这意味着第一个元素使用索引 0 而不是 1 进行访问。在这段代码中,数组元素从索引 1 到 `num` 进行访问,所以数组的大小被定义为 `MAX_NUM+1`,以适应这种索引方式。数组中的索引 0 处的元素在这段代码中没有被使用。

2. `arrange` 函数中的四个 `for` 循环用于根据特定的模式重新排列 `schedule` 数组中的元素。让我们逐个解释每个循环的目的:

  • 第一个循环 `for (i = begin + num/2; i < begin + num; i++)` 迭代范围的后半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 迭代 `schedule` 数组的后半部分列。此循环的目的是将范围的前半部分的值(`schedule[i-num/2][j-num/2]`)复制到范围的后半部分(`schedule[j]`)。
  •    第二个循环 `for (i = begin; i < begin + num/2; i++)` 迭代范围的前半部分,嵌套循环 `for (j = num/2 + 1; j <= num; j++)` 再次迭代 `schedule` 数组的后半部分列。此循环的目的与第一个循环类似,但是顺序相反。它将范围的后半部分的值(`schedule[i+num/2][j-num/2]`)复制到范围的前半部分(`schedule[j]`)。
  •    这些循环有助于按照特定的模式排列元素,但是在提供的代码中,没有直接清楚地说明具体的模式或代码的目的。没有附加的上下文或注释,很难确定代码的确切模式或目的。


3. `main` 函数中的最后一个 `for` 循环用于打印 `schedule` 数组的内容。它迭代 `schedule` 数组的每一行和每一列,并使用循环内的 `printf` 语句打印相应的值。`printf` 语句 `printf("%3d\t", schedule[j]);` 用于以 3 个字符的宽度打印每个值,后面跟一个制表符(`\t`)。在打印每一行后,打印一个换行符(`\n`)以换行到下一行。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-31 19:54:04 | 显示全部楼层
sfqxx 发表于 2023-5-31 19:46
让我们逐步回答您的每个问题:

1. 二维数组 `schedule` 被定义为 `int schedule[MAX_NUM+1][MAX_NUM+1]; ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-31 20:30:09 | 显示全部楼层
sfqxx 发表于 2023-5-31 19:41
不好意思,我的 gpt 出问题了,教育一番

能否教以下gpt怎么用,球球捏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 20:32:40 | 显示全部楼层
houqing1999 发表于 2023-5-31 20:30
能否教以下gpt怎么用,球球捏

e
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 20:54:09 | 显示全部楼层
这段代码看起来像是执行某种特殊的数据移动或数据拷贝。它似乎在一个二维数组或类似结构的`schedule`上进行操作,对数据进行特定的索引和重新排列。

第一个外部循环处理`schedule`中的后一半数据(从`begin + num/2`到`begin + num`),将每个元素从其原始位置移动到新的位置(`schedule[i-num/2][j-num/2]`)。

第二个外部循环处理`schedule`中的前一半数据(从`begin`到`begin + num/2`),将每个元素从其原始位置移动到新的位置(`schedule[i+num/2][j-num/2]`)。

至于这个具体是用来做什么的,可能需要更多的代码或者上下文信息才能得出结论。因为这些循环的具体含义和目的可能依赖于`schedule`的初始化,以及这段代码在整个程序中的位置和角色。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表