猴子选大王

合集下载

猴子竞选国王的心得

猴子竞选国王的心得

猴子竞选国王的心得
在很远的地方有一个森林王国。

国王是一只很老的大象。

这天他召集了王国里的动物,宣布要从所有动物中选出一个新国王。

动物们听到这个消息就像炸开了锅,有的在讨论怎么选新国王,有的则暗下决心要争做新国王……一天大象把所有的动物召集来开了个百兽大会,并发给他们每人一粒种子,叫他们埋到土里种起来,谁种出的花好看,谁就是国王,大象就用这种方法选出新国王。

所有的动物都把种子种下了地,他们精心照料着他们的种子,可是谁也没有种出来,机灵的小猴把种子换了,他的种子开出了鲜艳的花朵,小松鼠看见了,也纷纷效仿,就这样,一传十,十传百。

所有的动物都知道了,全换了种子,全都开出了美丽的花朵。

可小猴子却不知情,天天给花浇水施肥,可是还是没长出来。

大象把动物们再次召集起来,他发现就小猴子的种子没有开花,于是就说:“小猴子是个诚实的孩子,小猴子是新国王!”原来大象发给大家的是炒熟的种子,种子是种不出来的。

从此,小猴子治理的王国井井有序。

猴子选大王

猴子选大王

[题目]第1.1猴子选大王问题一:实验内容:M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。

二:实验要求:利用单向循环链表模拟此过程,输出选出的大王编号。

三:程序的设计思想:(1)问题分析:“猴子选大王”问题是约瑟夫环问题的一个特例。

由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。

而该问题又是一个不断的循环问题所以用循环链表来实现。

(2)总体设计:首先生成一个空链表,并给n个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n个结点的循环单链表。

再给每只猴子建立顺序的编号。

现从第一个结点开始报数,依次顺序查找出报数为m的待出列的结点(猴子)通过q->next=p->next删除该结点后继续运行否则让q成为p的前驱指针。

最后当p->next==p时停止运行,得到p所指向的结点即为猴子选出大王的编号。

四:提供测试结果:定义 n=8, m=3,测试结果如下:对猴子进行编号!1号猴子:12号猴子:23号猴子:34号猴子:45号猴子:56号猴子:67号猴子:78号猴子:82号猴子报:2 3号猴子报:3 3号猴被淘汰4号猴子报:1 5号猴子报:2 6号猴子报:3 6号猴被淘汰7号猴子报:1 8号猴子报:2 1号猴子报:3 1号猴被淘汰2号猴子报:1 4号猴子报:2 5号猴子报:3 5号猴被淘汰7号猴子报:1 8号猴子报:2 2号猴子报:3 2号猴被淘汰4号猴子报:1 7号猴子报:2 8号猴子报:3 8号猴被淘汰7号猴子报:24号猴子报:34号猴被淘汰7号猴子报:1胜出:7号猴子Press any key to continue五:程序源代码#include <stdio.h>#include <stdlib.h>#define n 8#define m 3typedef struct monkey{int num;struct monkey *next;} Monkey;int main(){Monkey *p,*head,*q;int i;head=p=q=malloc(sizeof(Monkey));//建立头指针 for(i=1;i<n;i++) //给n个结点分配空间{p=malloc(sizeof(Monkey));q=p;}q->next=head; //建立循环链表p=head;printf("对猴子进行编号!\n");for(i=1;i<=n;i++) //给n只猴子分别建立顺序编号{p->num=i;printf("%d号猴子:%d\n",p->num,p->num);p=p->next;}i=0; //初始化p=head;while(1){i++;printf("%d号猴子报:%d\n",p->num,i);if(p->next==p) break; //判断还剩下最后一个结点时停止运行 if(i==m) //报道m的猴子淘汰{i=0;printf("%d号猴被淘汰\n",p->num);q->next=p->next;continue;}else{if(i==m-1) q=p;p=p->next;}}printf("胜出:%d号猴子",p->num); }。

猴子选大王——精选推荐

猴子选大王——精选推荐

猴子选大王【问题】n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下的从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?【测试数据】【参考程序1】const number=3;var n,num,i,total:integer;a:array[1..100]of boolean; order:boolean;beginwriteln('input n:');readln(n);total:=n; {队伍中剩下的猴子数}for i:=1 to n do a[i]:=true;repeatorder:=true; {order=true:顺序报数} num:=0; {num:报的数字}for i:=1 to n do {顺序报数}if a[i] then begin {第i只在队列中才有资格报数}num:=num+1;if (num=number) then begin {如果为3} a[i]:=false;total:=total-1; {出队,且猴子数少1}num:=0; {num置0,又准备从1报起}end;end; {报到尾}if total>number-1 then order:=false; {如还要继续报,则从尾到头}num:=0; {从尾到头时,order=false}for i:=n downto 1 do {逆向报数}if a[i] then begin {在队列中}num:=num+1;if (num=number) then begina[i]:=false;total:=total-1;num:=0;end;end;until total=number-1; {直到剩下2只}if not order then for i:=1 to n do if a[i] then begin {报剩2只时,如上一次为从尾到头报数,则猴王为从头到尾报的第一只}writeln('The Monkey King is :',i);readln;halt;end;if order then for i:=n downto 1 do if a[i] then begin {报剩2只时,如上一次为从头到尾报数,则猴王为从尾到头报的第一只}writeln('The Monkey King is :',i);readln;halt;end;end.【参考程序2】程序1中,用了order来记录是顺序还是逆序报数,不太方便。

猴子当大王的寓言故事

猴子当大王的寓言故事

猴子当大王的寓言故事(原创实用版4篇)目录(篇1)1.故事背景和角色介绍2.猴子成为大王的过程3.猴子大王的治理方式4.猴子大王的下场5.故事的寓意正文(篇1)在很久很久以前,有一片茂密的森林里,住着各种各样的动物。

它们和谐相处,共同维护森林的生态平衡。

在这片森林里,狮子是当时的大王,它公正而明智地统治着这片土地。

然而,有一天,狮子因年事已高,决定将王位传给有能力的动物。

猴子作为森林里的智者,被众多动物推举为大王的候选人。

在众多动物的期待中,猴子开始了它的大王之路。

然而,猴子成为大王后,却逐渐变得贪婪和自私。

它开始压迫其他动物,霸占资源,甚至不允许其他动物靠近它。

在猴子的统治下,森林的生态平衡逐渐被破坏。

动物们开始对猴子大王心生不满,森林里的和谐氛围不复存在。

猴子大王不仅没有意识到自己的错误,反而变本加厉地压迫动物们,甚至对其他动物实施暴力。

有一天,不堪忍受猴子大王压迫的动物们决定联合起来,推翻猴子的统治。

在众多动物的共同努力下,猴子大王被赶下了宝座,恢复了狮子的统治。

森林重新回到了和谐安宁的状态。

这个寓言故事告诉我们,权力和地位并不能让人变得伟大。

一个人或一个动物,只有心怀善念,关爱他人,才能赢得他人的尊重和敬仰。

当权力和地位用来满足私欲时,必将遭到众人的反抗和唾弃。

目录(篇2)1.猴子与森林中的其他动物2.猴子成为大王的过程3.猴子大王的统治4.猴子大王的下场正文(篇2)在很久很久以前,有一片富饶的森林里,住着各种各样的动物。

它们和睦相处,共同维护着森林的生态平衡。

在这片森林中,猴子以其聪明才智而闻名,它们不仅擅长攀爬,还拥有独特的模仿能力。

有一天,森林中的狮子国王因为年事已高,决定将王位传给一位有能力的动物。

于是,狮子国王召集了森林里的所有动物,宣布将举行一场比赛,选拔出新的国王。

这场比赛分为三个阶段,分别是智慧、力量和勇气。

经过激烈的比拼,猴子脱颖而出,以其卓越的表现赢得了狮子国王的认可。

猴子当国王寓言故事

猴子当国王寓言故事

猴子当国王寓言故事有一次,猴子在动物大聚会时跳起舞来,赢得了大家的好感,故而被选为动物之王。

然而,孤狸十分嫉妒猴子当选为王。

有一天,当他发现一个捕兽夹子里有一块肉时,便把猴子带过去说:“我发现这里有些好吃的东西,陛下,但是我没敢动用,因为我认为应该留给国王享用。

您能亲自去取吗?”猴子立刻跑过去拿,结果却被夹子夹住了。

他斥责狐狸陷害他,而狐狸却笑着说:“猴子,你这种笨蛋竟然还想做万兽之王!”【猴子当国王的寓意】新梦想提供的`这篇猴子当国王的寓言告诉我们,在任何时候都不能骄傲,否则就会落到像猴子一样的下场。

【猴子当国王英文版】THE MONKEY AS KINGAt a gathering of all the animals the Monkey danced and delighted them SO much that they made him their King.The Fox,however.was very much disgusted at the promotion of the Monkey:SO having one day found a trap with apiece ofmeatinit,hetooktheMonkeythere and saidto him,“Here is a dainty morsel I have found,sire;I did not take it myself,because l thought it oughtto be reserved for you,ourK ing.Will you be pleased to accept it?’’The Monkey made at once for the meat and got caught in the trap.Then he bitterly reproached the Fox for leading him into danger;but the Fox only laughed and said,“O Monkey,you call yourself King of the Beasts and haven’t more sense than tn he taken in like thatf”。

猴子选大王_五年级作文

猴子选大王_五年级作文

猴子选大王
一天,猴子们集合在一个地方开会,会的内容是选一位大王来带领我们猴子群。

老猴汤尔说:“我年纪最大,经验也最丰富,猴子群就让我来带领吧!”猴子们大都没什么意见,只有小猴狒狒跳出来说:“不行不行,万一爷爷死了,那不是又得重新选过大王吗?这样太麻烦了!”听了狒狒的提示,猴子们都觉得狒狒说得对,大猴狒儿就接着提出了个新建议:“我们猴子会爬树,干脆大伙举行一个爬树比赛,谁赢了,谁就当大王吧!”猴子们听了这个建议,都异口同声地说“好!”,“那我们就把比赛定在五天后吧!”汤姆说,“这样就有时间练习了。

”在这段时间内,猴子都纷纷出来练习,有的上窜下跳,有的在做猴子自己创造的广播操,有的在跑步……一个个都在为五天之后的比赛做准备。

令猴子期待的日子终于来到了,猴子个个大显身手来爬树。

可是,令猴子大吃一惊的事情发生了,汤姆为了得第一名,在一棵树上使命地摇,导致自己站立的树枝断了,汤姆危在旦夕。

霎时,在一旁爬树的狒狒跳出树干,救出了汤姆,而比赛也只得了最后的一名。

可是,猴子们依然觉得狒狒来当大王比较合适,因为狒狒它“为猴善良”和“乐于助猴”。

爬树得了第一名的很后悔,后悔当初没有去救它。

瞧!猴子原来是群龙无首,现
第1页共1页。

Res_猴子选大王2

Res_猴子选大王2

5.4.8 实验项目5-14:猴子选大王1、实验名称:猴子选大王2、实验目的:(1)熟练使用循环控制。

(2)熟练理解和掌握二维数组存储结构的使用技巧。

3、实验任务(1)实验内容:一群猴子要选新猴王。

新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。

从第1号开始报数(从1到3),凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。

如此不断循环,最后剩下的一只猴子就选为猴王。

请问是原来第几号猴子当选猴王?(2)实验要求:输入一个正整数n(n<=100),写一个程序来模拟这个过程,输出猴王的序号。

测试用例:4、实验要点分析(1)问题分析:用循环的方法模拟选猴王的过程。

一种简单的方法是对n只猴子用1~n 编号,编号存放在大小为n的一维整数数组中,若某编号的猴子要退出圈子,则把其编号改为-1。

若数组中只剩一个非-1的编号时,该编号的猴子就是大王。

开始时数组中的元素是从1到n的整数,表示都在“圈子”中,凡报到3的猴子退出圈子,即置为-1。

再依次查找下一只在“圈子”中的猴子,并重新开始报数。

这个过程进行n-1次,就只剩下一只编号不是-1的猴子了。

这种方法在寻找“下一个在圈子中的猴子”时可能会遇到很多“-1”而浪费时间。

另一种改进的方法是把n只猴子用0~n-1编号,数组的下标表示猴子的编号,数组元素的值表示相邻下一只在圈子中的猴子编号。

比如,n=5时,初始的数组M的内容如下表: 下标:0 1 2 3 4当2号猴子(报数轮到3)退出圈子时,1号猴子的下一只相邻猴子就是3号猴子了,实现时只需一个赋值M[1]=M[2](即原来2号猴子的下一只相邻猴子成了1号猴子的下一只相邻猴子)。

数组M的内容变成了下表:下标:0 1 2 3 4这样做的好处有两个,一是第i号猴子的下一只相邻猴子就是M[i],不需要用一个循环去找了;二是不用当心数组M下标的访问会越界。

(2)实现要点:1)循环控制结构。

猴子当大王的寓言故事的道理

猴子当大王的寓言故事的道理

猴子当大王的寓言故事的道理
1. 不要小瞧任何人或事物,哪怕是一只猴子也可能成为大王。

就像生活中那些曾经不被看好的人,最后却取得了巨大成功。

比如一个穷小子最后成了大企业家,这多神奇呀!
2. 机会随时可能降临,要做好准备。

想想看,猴子当大王不也是抓住了机会吗?就像那个平时默默努力的员工,突然有一天因为一个契机就升职了。

3. 有梦想就要去追,猴子都能当大王,我们为什么不行呢?就如同那个热爱画画的孩子,不顾别人嘲笑,最后成了知名画家,多了不起!
4. 不能以貌取人,猴子也有当大王的本事。

这就和那个其貌不扬的科学家一样,谁能想到他能有那么伟大的发明呢?
5. 团结的力量很强大,猴子们团结起来才能让它们的大王更有权威。

这和我们的团队合作不是一样吗?大家齐心协力才能获得成功。

6. 自信能让你走得更远,猴子要是不自信怎么能当大王呢?就像那个勇敢参加比赛的选手,相信自己能赢,最后真的做到了。

7. 勇于尝试新事物,猴子当大王也许就是一次大胆的尝试。

就好像那个第一次尝试跳伞的人,体验到了不一样的精彩。

8. 不要害怕失败,猴子当大王的路上肯定也经历过失败吧。

就如同创业失败多次但最终成功的人,不放弃就会有希望啊!
9. 要善于学习,猴子当大王也得不断学习进步呀。

就像我们不断学习新知识,才能让自己变得更优秀。

10. 保持乐观的心态,猴子能当大王不就是乐观面对一切吗?想想那些遇到困难依然微笑的人,多让人敬佩呀!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、猴子选大王课题描述
一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1
到m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

猴子选大王系统设计
1、猴子选大王总体设计结构图
2、系统数据的数据结构设计
猴子的存放采用链式存储结构,利用循环链表来实现建立的,其表示方法是递归定义的.
(1)、变量说明
程序中使用的存储结构:ListNode结构体
Struct ListNode{
Int data; //数据域
Struct ListNode *nextPtr; //指向后继结点的指针域
};
Int monkeys,count //分别为猴子的个数和猴子的报数
HeadPtr,tailPtr,currentPtr //分别为链表的头结点,尾结点和结点
HeadPtr1,headPtr2 //分别为选大王的单循环链表和由淘汰的猴子所构成的链表
(2)、函数说明
DestroyList (LISTNODEPTR headPtr) //用destroylist函数来释放选大王链表的各个结点
CreateList (int n) //创建循环链表,容纳n个猴子
Printf(“input the amount of monkeys:”) //用printf函数来提示输入的内容
Scanf(“%d”,&monkeys) //用scanf函数来输入猴子的个数
Printf(“input the count number:”) //用printf函数来提示报数的数
Scanf(“%d”,&count) //用scanf函数来输入每次数到的猴子就出局(3)、while循环说明
while(currentPtr1!=currentPtr1->nextPtr){
/*往后数一个猴子*/
prePtr1=currentPtr1;
currentPtr1=currentPtr1->nextPtr;
count++;
/*若数到n,则淘汰currentPtr指向的猴子*/
if(count%n==0){
/*从headPtr1指向链表中拆下currentPtr指向的结点*/
prePtr1->nextPtr=currentPtr1->nextPtr;
currentPtr1->nextPtr=NULL;
/*将currentPtr1指向的结点插入到headPtr2指向链表中*/
if(headPtr2==NULL){/*若headPtr2指向的为空链表*/
headPtr2=currentPtr1;
tailPtr2=currentPtr1;
}
else{ /*将拆下来的结点组装到headPtr2指向的链表上*/ tailPtr2->nextPtr=currentPtr1;
tailPtr2=tailPtr2->nextPtr;
}
currentPtr1=prePtr1; /*currentPtr1指向上一个结点,为下一次数数做准备*/
}
}
二、猴子选大王重点及关键技术分析
程序通过循环链表较好的实现了猴子选大王的功能,但是还是有许多值得思考的地方。

1、由于N = 1的情况比较复杂,程序中对它作了模糊处理,没有复杂化,直接用n>=2。

2、无论是用链表还是用数组实现都有一个共同点:要模拟整个过程,不仅程序比较烦,而且时间复杂度高达O(n*m),当n,m非常大的时候,几乎是没有办法在短时间算内出结果的。

后来注意到原问题仅仅是要求出最后的猴子大王的序号,而不是要模拟整个过程。

为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。

求胜利者的编号。

我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。

现在把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-2 --> n-2
k-1 --> n-1
变换后就完完全全成为了(n-1)个人报数的子问题,假如知道这个子问题的解:例如x是最终的猴王,那么根据上面这个表把这个x变回到x'=(x+k)%n
不刚好就是n个人情况的解吗!
如何知道(n-1)个人报数的问题的解?只要知道(n-2)个人的解就行了。

(n-2)个人的解呢?当然是先求(n-3)的情况---- 这显然就是一个倒推问题!到这里,思路出来了,下面就开始写递推公式:
令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n] 递推公式
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
有了这个公式,所要做的就是从1-n顺序算出f[i]的数值,最后结果是f[n]。

因为实际生活中编号总是从1开始,我们输出f[n]+1
由于是逐级递推,不需要保存每个f[i],程序也是异常简单:
#include “stdio.h”
V oid main()
{
int n, m, i, s=0;
printf ("n和m的值是:\n ");
scanf("%d%d", &n, &m);
for (i=2; i<=n; i++) s=(s+m)%i;
printf ("猴王是%d\n", s+1);
}
这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。

可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。

但是我总觉得这样做,太简单了,然后我就想到用链表来存放猴子数,并且做好是能把淘汰的猴子的序列显示出来,然后就想到了用两个链表来完成,一个链表用来表示选大王的循环链表,另一个用来表示淘汰的猴子所组成的表。

在怎个设计的过程中,使用到的有”数据结构中的遍历”、“创建”、“删除、“释放”以及指针和链表的一些操作,这些都是有一些难度的.
三、猴子选大王设计结构与分析
在修改程序的时候,出现了很多很多的错误,有一些很基本的,也有一些是我不能解决的,但最后通过一些办法,一步步的调试,最后终于调试成功了。

1、运行成功后显示画面如下图所示
2、输入猴子数89后显示的画面如下图所示
3、数入count报数为8后显示的画面如下图所示
本次截图总共有三个结果,第一个为猴子的总数为89只,报数道8,则那只猴子出局。

最后结构为,第9号猴子是大王。

四、猴子选大王进度安排
在第十周和十一周,我主要是对“猴子选大王”这个课题进行了全方
面的分析,想出了初步解决此问题的一些算法,和确定了我所用的开发工具
以及开发语言。

在十二周到十四周,我主要着重在写代码这一部分,我选择了C语言来实现课题,但由于有些东西有点模棱两可,所以在网上和书上找了一些别人用过的函数和借用了一些算法思想,来完成初代码。

特别是在写遍历链表时,由于在学数据结构的时候,都没怎么弄懂,所以,在写这一部分的代码时,都是借用别人的。

相关文档
最新文档