数据结构--猴子选大王
猴博士数据结构与算法

猴博士数据结构与算法
猴博士数据结构与算法是一本经典的计算机科学教材,主要介绍了数据结构和算法的基本概念、原理和应用。
该书由美国计算机科学家托马斯·H·科尔曼(Thomas H. Cormen)等人共同编写,首次出版于1990年,目前已经成为世界各大高校计算机科学专业的必读教材之一。
猴博士数据结构与算法通过简明易懂的语言和丰富的示例,系统地介绍了各种常见的数据结构和算法,包括数组、链表、栈、队列、树、图、排序、查找等。
该书不仅详细解释了每种数据结构和算法的特点、操作和应用场景,还给出了具体的实现代码和运行时间分析,使读者能够深入理解并灵活应用这些概念和技巧。
猴博士数据结构与算法的特点之一是强调算法的设计原则和分析方法。
书中介绍了常见的算法设计技巧,如贪心算法、动态规划算法和分治算法,并给出了实际问题的解决思路和算法设计过程。
此外,书中还介绍了算法的复杂度分析方法,包括时间复杂度和空间复杂度,并给出了一些常见算法的分析结果,帮助读者评估算法的效率和性能。
猴博士数据结构与算法不仅适用于计算机科学专业的学生和教师,也适用于从事软件开发和算法研究的工程师和科研人员。
通过学习该教材,读者可以全面了解数据结构和算法的基本原理和应用,提高编程和问题解决的能力,并为进一步学习和研究提供了良好的基础。
约瑟夫问题

cout<<endl;
return 0;
}
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m
,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,
这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
int main()
{
int i,j,nx[10000] = {0},n[10000] = {0},m[10000] = {1},counter[2] = {0};//数组要足够大才能不停止运行
{ j = j % nx[i]; //求余实现循环从0-n移动或用if判断实现循环
if(n[j] == 0)
{ counter[0]++; //计数器记录具有某一特点的数的次数
if(counter[0] % m[i] == 0)n[j] = 1,counter[1]+& = 0;j < nx[i];j++)
if(!n[j])cout<<j + 1<<endl;
for(j = 0;j < 10000;j++)n[j] = 0;for(j = 0;j < 2;j++)counter[j] = 0; //初始化需要重新使用的变量
for(i = 1;m[i - 1] != 0;i++) //利用m[]只有最后的值为0判定,不使用m[0]并赋值为1,其余默认为0
cin>>nx[i]>>m[i];
for(i = 1;m[i] != 0;i++)
数据结构课程设计报告

*****数据结构课程设计题目: 赫夫曼树的建立运动会分数统计订票系统猴子选大王图的建立与输出姓名:***学号 ****专业:计算机科学与技术指导教师:****2006年9月20日目录一:绪言 (3)1.1课题设计背景 (3)1.2课题研究的目的和意义…………………………….3.1.3课题研究的内容 (4)二:主菜单设计 (4)2.1主菜单 (4)2.2主菜单源代码 (4)2.3主菜单流程图 (5)三:具体程序设计 (6)3.1赫夫曼树的建立 (6)3.2运动会设计 (8)3.3订票系统 (12)3.4猴子选大王 (15)3.5图的建立及输出 (16)四:总结与展望 (19)五:参考文献 (19).1.绪言1.1 课题背景《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
从70年代中期到80年代初,各种版本的数据结构著作就相继出现。
目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一。
《数据结构》在计算机科学中是一门综合性的专业基础课。
数据结构的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
蓝桥杯-猴子选大王(约瑟夫问题)

蓝桥杯-猴⼦选⼤王(约瑟夫问题)标题:猴⼦选⼤王⼀群猴⼦要选新猴王。
新猴王的选择⽅法是:让N只候选猴⼦围成⼀圈,从某位置起顺序编号为1~N号。
从第1号开始报数,每轮从1报到3,凡报到3的猴⼦即退出圈⼦,接着⼜从紧邻的下⼀只猴⼦开始同样的报数。
如此不断循环,最后剩下的⼀只猴⼦就选为猴王。
请问是原来第⼏号猴⼦当选猴王?输⼊格式:输⼊在⼀⾏中给⼀个正整数N(≤1000)。
输出格式:在⼀⾏中输出当选猴王的编号。
输⼊样例:11输出样例:7思路⼀:⽤数组模拟⼀个环,存储第下标+1位猴⼦是否退出(因为下标从0开始),数组初始化为0,每次轮到数3的猴⼦就将他的下标置为-1,最后⼀个下标不为-1的猴⼦就是选中的王。
1 #include<bits/stdc++.h>2using namespace std;34const int N = 1000; //共有N个猴⼦56int a[N]; //⽤数组和%操作模拟圈78int index = 0; //下标index9int i = 1; //⽤来对3计数10int counter; //记录每次剩下的猴⼦个数1112int main()13 {14int num; //num是猴⼦的数量15 cin >> num;16 counter = num;1718while(counter > 1)19 {20if(a[index] != -1) //当下标为index的猴⼦还在圈内时21 {22if(i == 3)23 {24 a[index] = -1; //将数到3的猴⼦退出圈⼦,将下标置为-125 counter--; //剩下的猴⼦总个数-126 }2728 i++;2930if(i > 3) //i=4时候,i要回到131 {32 i = i % 3;33 }34 }3536 index++;3738if(index >= num) //当下标达到了猴⼦总数时,要回到开头39 {40 index = index % num;41 }4243 }4445for(int i = 0; i < num; i++)46 {47if(a[i] != -1)48 {49 cout << i + 1; //数组下标是从0开始的,要+150 }51 }5253return0;54 }思路2:使⽤递归思想1 #include<bits/stdc++.h>2using namespace std;34int fun(int n)5 {6if(1 == n)7 {8return0;9 }1011return (fun(n - 1) + 3) % n;12 }1314int main()15 {16int n;17 cin >> n;18 cout << fun(n) + 1;19return0;20 }。
用C编写程序猴子选大王

湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 06级计算机科学与技术专业一班学生姓名:学号:06408109 06408102 06408107 0640812206408103指导教师: 刘刚常开题时间: 2008 年 6 月16 日完成时间: 2008 年 6 月29 日目录摘要 (3)一、引言 (4)二、设计目的与任务 (4)三、设计方案 (5)1、总体设计 (5)2、详细设计 (8)3、程序清单 (14)4、程序调试与体会 (22)5、运行结果 (23)四、结论 (24)五、致谢 (24)六、参考文献 (25)摘要本文首先介绍顺序表和链表并作以比较,我们分别使用循环队列和循环链表来解决猴子选大王的问题,程序使用了C语言编写,有很少一部分函数是用C++编写的,有比较详细的中文注释并在VC++下调试运行通过。
整个程序使用中文界面,并有相应的提示信息,便于操作和程序运行。
关键词:循环队列;循环链表;存储结构AbstractThis paper details the difference of sequence list and linklist.We respectively use queue and circular queue and circular linked list to solve the seek elected king of the monkey problem . The procedure write with C language ,a very small part function is used by the C + +,and has chinese explanatory note.What’s more,it was debugged in VC++ debugger and run very well.The whole procedure,with Chinese interface and thecorresponding hints,is convenient to run and easy to be operated.Keywords : circular queue;circular linked list ;storage structure《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。
数据结构课程设计(附代码)-数据结构设计

上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。
5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。
链表长度加一,重新存储。
(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。
(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
讲题比赛讲稿

讲题比赛讲稿一、问题的提出我今天要讲的是第12题。
题目为:有2015个同学站成一个圆圈,按顺时针方向编号:1—2015。
现在从1号开始,按“0、1、0、1、0、1……”的方式报数,报到1的同学立即离开,不再参与报数。
到最后只剩一个同学时报数停止。
请问最后留下的这个同学的编号是多少?二、问题分析这道题其实源于一道很有意思约瑟夫问题。
约瑟夫问题,有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数3该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
回到我今天要讲的题目。
题目中将约瑟夫问题中的报数方式置换成“0、1、0、1……”循环报数,而且将结果也变成了“最后留下的同学的编号是多少?”虽然题目条件有了变化,但是仍然属于“约瑟夫问题”,可以用该类方法进行分析和解决。
三、问题的研究拿到题目以后,我们对此题的研究经历了三个阶段。
第一阶段:自我摸索阶段拿到题后,我简直有点懵。
说实话,我从来没有遇到过这样的题。
不过我想,通过网络搜索应该会有些眉目。
可是当我将原题输入百度以后,却找不到答案。
我只能对着题目,自己动手研究了。
首先我想到数的奇偶问题。
当总人数为奇数时,第一轮留下的是所有奇数编号;而到第二轮……情况比较复杂了。
而当总人数为偶数时,那么第一轮排除的是偶数编号;第二轮排除的就是4n的编号;第三轮时,剩下的编号可能是奇数个,怎么办呢?再次受挫的我只能像个小学生一样从最原始的方法开始模拟游戏过程。
我从3人开始研究3人留下的是3号;4人留下的是1号……当研究到8人留下是1号时,我恍如黑暗中窥见无限光明。
猴子算法

一、猴子选大王:(1)M只猴子要选大王,选举办法如下:所有猴子按1-M编号围坐一圈,从1号开始按顺序1,2,,,K报数,凡报到K的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和K由输入文件提供,要求在输出文件中打印出最后剩下的猴子的编号。
数据规模(M<=1000,K<=10)【输入文件】输入文件monkey.in 的第1 行,为两个正整数,用一个空格隔开:M K【输出文件】输出文件monkey.out 只有一个正整数,输出最后一个猴子的编号【输入样例】7 3【输出样例】4这就是顶顶有名的约瑟夫问题。
这是一个据说是由古罗马著名史学家Josephus提出的问题演变而来的。
称之为约瑟夫问题。
很多资料上对这一问题解释得过于繁杂,实现起来不好理解。
在这里介绍一下本人的一些想法以供大家参考。
这个题目其实就是一种编程的经验问题。
我们可以假设猴子就位的状态用1表示,把猴子离开的状态用0表示。
那么我们就可以用一个a[M]的数组来存放M个猴子是否就位的状态。
我们可以一边报数一边遍历该数组,每遇到第K个1时,就把当前位置的1变为0,表示当前位置的猴子已经出局了。
一直循环遍历到我们的状态数组只有一个1的时候,这个存放1的数组下标再加上1(因为数组下标是由0开始的,所以要加1)即为选出的大王的编号。
想法很简单,现在关键的问题是如何解决当报数到第M个猴子的时候如何使得下一个报数重新回到第1个猴子处,也就是如何使用一维数组来解决环型问题的求解技巧。
大家想一下当我们的猴子围成圈坐的时候,问题其实由简单的一维数组变成了首尾相接的环型数组,也就是我们数据结构中的环型队列。
假设p为当前数组某一元素的下标,对于一维数组来说,我们只要p++就可以移动到下一个元素的位置上。
那么当p=M时,如果我们直接使用p++的话,p的值就超出了a[M]数组的最大长度,我们想要的是p++之后等于0。
那么如何实现呢?解决环型数组循环遍历元素的方法:对于环型数组移动下标时,我们如果每次在p++之后再加上p=p%M的话就能解决先前遇到的越界的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书课题名称:猴子选大王学生学号:专业班级:计算机科学与技术学生姓名:学生成绩:指导教师:课题工作时间:至摘要本次程序程序设计的主要目的是解决变相的“约瑟夫环”问题---猴子选大王。
从而使复杂的选举工作变得明朗化。
全程序以数据结构(C语言)中的循环单链表为主要的设计支柱,利用了C语言简洁紧凑、灵活方便,语法限制不太严格,程序设计自由度大,生成目标代码质量高,程序执行效率高等方面的优点。
循环单链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环,基于这样的特点,它适合处理具有环形结构的数据元素序列。
在程序代码的编写中,运用了结构体类型(struct Node),动态申请内存空间函数malloc(),释放动态申请内存空间函数free()等类型,同时也具有多种循环、条件语句控制程序流向,如:嵌套if else语句,多重for循环语句,还有链表中结点指针(p->next),从而使程序完全结构化。
这样编写出的完整程序代码可以实现“猴子选大王”功能,输入猴子的数目m,循环数n,对m个猴子进行编号,通过嵌套if else语句,for语句,一遍一遍的循环,判断,删除,直到只剩下最后一个猴子,即大王。
这样就可以实现所需的基本功能了。
关键词:数据结构;循环;单链表AbstractThe main purpose of the program design process to solve the form of "Joseph Ring" in the election --- monkey king. So complex it became clear the election.All procedures for data structures (C language) in single-cycle design of the main pillars of the list, using the C language simple and compact, flexible and convenient, the syntax is not strictly limited, program design flexibility to produce high quality object code, program execution the advantages of higher efficiency. Single-loop single-linked list is another form of list, its structural features is the last node list pointer field is no longer the end of the tag, but point to the list the first node, so that form a ring list, based on Such features, it has a ring structure for the data processing sequence of elements.The preparation of the program code, the use of a structure type (struct Node), dynamic application memory function malloc (), the release of dynamic memory functions for free () and other types, but also with a variety of loop, conditional statements control program flow such as: nested if else statements, multiple for loop, there is a linked list node pointer (p-> next), to make the program fully structured.Write such a code can achieve a complete "Monkey King selected" feature, enter the number of monkeys m, cycles n, for number of monkeys on the m-by nested if else statements, for statements, loop over and over again, judge, removed until there are only a monkey, or king. This can achieve the required basic function.Keywords: data structures; circulation; single linked list第一章课程设计目的与要求1.1 课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风1.2 课程设计的实验环境课程设计使用C语言工具,C语言作为一种最基本简单的程序设计语言,C语言发展迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。
许多著名的系统软件,如DBASE Ⅳ都是由C 语言编写的。
用C 语言加上一些汇编语言子程序,就更能显示C 语言的优势了,像PC- DOS 、WORDSTAR等就是用这种方法编写的。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++ ,Borland C++ Builder,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free, win-tc 等等……对于一个初学者,Microsoft Visual C++是一个比较好的软件。
界面友好,功能强大,调试也很方便1.3 课程设计的要求1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
第二章课程设计内容2.1 问题描述1、一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2、基本要求:输入数据:输入m,n 为整数3、输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
2.2需求分析一群猴子(m个)按照编号的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
程序规定:(1)在程序中输入猴子数m、要报的数n(2),对猴子进行编号(3)利用循环链表,依次序删除猴子,找出最后一个猴子,即为大王,输出这只猴子的编号2.3具体设计和实现1.对每一个猴子进行编号r=q=(listnode *)malloc(sizeof(listnode));for(i=1;i<n;i++){p=(listnode*)malloc(sizeof(listnode));q->data=i;q->next=p;q=p;}p->data=n;p->next=r;r=p;2.每数到n便删除该猴子,当循环单链表只剩一个时,输出该编号for(i=1;i<=n-1;i++){for(j=1;j<=k-1;j++)p=p->next;q=p->next;p->next=q->next;if(i % 10==0)free(q);}printf("\n");r=p;return r;}void outring(int n,linklist r){int i;listnode *p;p=r;printf("猴子大王:");printf("%4d\n",p->data);3.主函数int main(){linklist r;int n,k;linklist initring(int n,linklist r);linklist deletedeath(int n,int k,linklist r); void outring(int n,linklist r);printf("请输入猴子总数m:");scanf("%d",&n);printf("请输入n:");scanf("%d",&k);r=initring(n,r);r=deletedeath(n,k,r);outring(n,r);}2.4运行结果分析输入猴子的数目以及n最后得到结果运行结果如下:得到了预期结果第三章课程设计总结次课程设计在整整一周的时间内得以完成,全部内容主要包括:目录,课题设计背景,详细设计,设计结果及分析等方面的内容,主要通过上网收集资料,查找参考书目,了解图书管理的设计背景,明确设计方向和内容,在此基础上形成了该课程设计的的基础框架。