diff --git a/3/table.dat b/3/table.dat index d7dd1e5..3728290 100644 Binary files a/3/table.dat and b/3/table.dat differ diff --git a/report.md b/report.md index eeea8f9..e41c64e 100644 --- a/report.md +++ b/report.md @@ -174,15 +174,13 @@ int main() { 狼不吃白菜。请求出农夫将所有的东西运过河的方案。 ## 实现提示 -求解这个问题的简单方法是一步一步进行试探,每一步搜索所有可能的选择 -,对前一步合适的选择后再考虑下一步的各种方案。要模拟农夫过河问题,首先 -需要对问题中的每个角色的位置进行描述。可用4位二进制数顺序分别表示农夫、 -狼、白菜和羊的位置。用0表在南岸,1表示在北岸。例如,整数5 (0101)表示农 +求解这个问题的简单方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择后再考虑下一步的各种方案。要模拟农夫过河问题,首先需要对问题中的每个角色的位置进行描述。可用`4`位二进制数顺序分别表示农夫、狼、白菜和羊的位置。用0表在南岸,1表示在北岸。例如,整数`5` (`0101`)表示农 夫和白菜在南岸,而狼和羊在北岸。 -现在问题变成:从初始的状态二进制0000(全部在河的南岸)出发,寻找一种 -全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目 -标。总状态共16种(0000到1111),(或者看成16个顶点的有向图)可采用广度优先或深度优先的搜索策略---得到从0000到1111的安全路径。 + +现在问题变成:从初始的状态二进制`0000`(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制`1111`(全部到达河的北岸)为最终目标。总状态共16种(`0000`到`1111`),(或者看成`16`个顶点的有向图)可采用广度优先或深度优先的搜索策略`---`得到从`0000`到`1111`的安全路径。 + 以广度优先为例:整数队列---逐层存放下一步可能的安全状态;Visited[16]数组标记该状态是否已访问过,若访问过,则记录前驱状态值---安全路径。 + 最终的过河方案应用汉字显示出每一步的两岸状态。 ## 思路 @@ -380,6 +378,10 @@ B > ## 思路 参考代码中的 `main.c`,使用 `TableInfo` 结构体存储表格信息,使用 `key.h` 存储键盘按键的宏定义,使用 `conio.h` 实现光标移动,使用 `stdlib.h` 实现 `malloc` 函数,使用 `string.h` 实现 `strcpy` 函数,使用 `stdio.h` 实现 `printf` 函数,使用 `math.h` 实现 `atoi` 函数。 +## 运行结果 +大致如下,具体交互功能请运行代码 + +![1702985432960.png](https://picture-1300689095.file.myqcloud.com/2023/12/19/65817edc94e80.png) ## 代码及解释 `key.h` @@ -1487,16 +1489,20 @@ int main() { # 实验四 八皇后问题 ## 问题描述 -设在初始状态下在国际象棋的棋盘上没有任何棋子(这里的棋子指皇后棋子)。然后顺序在第1行,第2行……第8行上布放棋子。在每一行中共有8个可选择的位置,但在任一时刻棋盘的合法布局都必须满足3个限制条件(1)任意两个棋子不得放在同一行(2)任意两个棋子不得放在同一列上(3)任意棋子不得放在同一正斜线和反斜线上。 +设在初始状态下在国际象棋的棋盘上没有任何棋子(这里的棋子指皇后棋子)。然后顺序在第`1`行,第`2`行……第`8`行上布放棋子。在每一行中共有`8`个可选择的位置,但在任一时刻棋盘的合法布局都必须满足`3`个限制条件 + +1. 任意两个棋子不得放在同一行 +2. 任意两个棋子不得放在同一列上 +3. 任意棋子不得放在同一正斜线和反斜线上。 ## 基本要求 编写求解并输出此问题的一个合法布局的程序。 ## 实现提示: -在第i行布放棋子时,从第1列到第8列逐列考察。当在第i行第j列布放棋子时,需要考察布放棋子后在行方向、列方向、正斜线和反斜线方向上的布局状态是否合法,若该棋子布放合法,再递归求解在第i+1行布放棋子;若该棋子布放不合法,移去这个棋子,恢复布放该棋子前的状态,然后再试探在第i行第j+1列布放棋子。 +在第`i`行布放棋子时,从第`1`列到第`8`列逐列考察。当在第`i`行第`j`列布放棋子时,需要考察布放棋子后在行方向、列方向、正斜线和反斜线方向上的布局状态是否合法,若该棋子布放合法,再递归求解在第`i+1`行布放棋子;若该棋子布放不合法,移去这个棋子,恢复布放该棋子前的状态,然后再试探在第`i`行第`j+1`列布放棋子。 ## 思路 -使用回溯法,从第一行开始,每一行都有 n 个选择,如果选择合法,就继续下一行,否则就回溯到上一行,重新选择。 +使用回溯法,从第一行开始,每一行都有 `n` 个选择,如果选择合法,就继续下一行,否则就回溯到上一行,重新选择。 ## 代码 参考 洛谷 P1219 实现的 `n` 皇后问题 @@ -1573,6 +1579,7 @@ int main() { ``` ## 输出 +仅输出前三个解 ``` Q....... ....Q... @@ -1613,6 +1620,7 @@ Q....... ``` ## 输出2 +仅输出前三个解 ``` Q........... ..Q......... @@ -1757,13 +1765,13 @@ int main() { 3. 若根据给定的条件问题无解,则报告适当的信息;否则,将教学 计划输出到用户指定的文件中。计划的表格格式自行设计。 -## 实现提示: +## 实现提示 可设学期总数不超过12,课程总数小于100。如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。 -## 思路: +## 思路 使用拓扑排序,先将课程按照先修课程的数量进行排序,先修课程数量越多的课程越靠前,然后从前往后,如果学期学习数量小于平均值,则将前面的课程往后移动。 -## 代码: +## 代码 ```c++ #include @@ -2268,12 +2276,14 @@ int main() { ``` #### 输入 +``` 10 2 5 10 8 7 9 4 6 1 3 3 2 5 9 +``` #### 输出 ``` @@ -2732,12 +2742,14 @@ int main() { ``` #### 输入 +``` 10 2 5 10 8 7 9 4 6 1 3 3 2 5 9 +``` #### 输出 二叉树图形输出为竖着 @@ -2824,11 +2836,11 @@ ASL: 1.700000 ## 问题描述 录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。 ## 基本要求 -1. 通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat。 -2. 对文件 input.dat 中的数据进行处理,要求具有如下功能: +1. 通过键盘输入各学生的多门课程的成绩,建立相应的文件`input.dat`。 +2. 对文件 `input.dat` 中的数据进行处理,要求具有如下功能: 1. 按各门课程成绩排序,并生成相应的文件输出。 2. 计算每人的平均成绩,按平均成绩排序,并生成文件。 - 3. 求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69分人数、70-79分人数、 80-89分人数、90分以上人数。 + 3. 求出各门课程的平均成绩、最高分、最低分、不及格人数、`60-69`分人数、`70-79`分人数、 `80-89`分人数、`90`分以上人数。 4. 根据姓名或学号查询某人的各门成绩,重名情况也能处理。 ## 代码 @@ -2855,7 +2867,6 @@ void save_to_file(Score **scores, int n, char *file_name) { } int main() { - Score *scores[105]; int n; // 如果 score.dat 不存在,就从键盘输入 @@ -3195,7 +3206,10 @@ L6 2. 输出多项式:遍历链表,按格式输出多项式的每一项。 3. 多项式相加:遍历两个链表,同时比较节点的指数大小,按照大小关系进行处理。如果两个指数相等,则将系数相加并创建新的节点插入到结果链表中;如果一个指数较大,则将该项直接插入结果链表中;如果一个指数较小,则将该项的系数取负数后插入结果链表中。 4. 多项式相减:与多项式相加类似,不同的是需要将第二个多项式的所有系数取负数。 -5. 计算多项式在某个点的值:遍历链表,依次将每一项的系数乘以x的指数次方,并累加到结果中。 +5. 计算多项式在某个点的值:遍历链表,依次将每一项的系数乘以`x`的指数次方,并累加到结果中。 + +## 思路 +直接模拟 ## 代码 ```c @@ -3478,7 +3492,9 @@ int main() { ``` # 实验感悟 -通过本学期的数据结构实验, 我对数据结构有了更深的理解, 也对C语言有了更深的理解. 通过实验, 我学会了如何使用C和C++语言来实现各种数据结构, 也学会了如何使用各种数据结构来解决实际问题. +通过本学期的数据结构实验, 我对数据结构有了更深的理解, 也对`C`语言有了更深的理解. 通过实验, 我学会了如何使用`C`和`C++`语言来实现各种数据结构, 也学会了如何使用各种数据结构来解决实际问题. # 更多 -Qt 版本的电子表格等待制作中, 预计在假期尝试. \ No newline at end of file +`Qt` 版本的电子表格等待制作中, 预计在假期尝试. + +`Luthics` 的个人博客:[https://www.luthics.com/](https://www.luthics.com/) \ No newline at end of file