猴子选大王
猴子竞选国王的心得
![猴子竞选国王的心得](https://img.taocdn.com/s3/m/030ea327a517866fb84ae45c3b3567ec102ddc27.png)
猴子竞选国王的心得
在很远的地方有一个森林王国。
国王是一只很老的大象。
这天他召集了王国里的动物,宣布要从所有动物中选出一个新国王。
动物们听到这个消息就像炸开了锅,有的在讨论怎么选新国王,有的则暗下决心要争做新国王……一天大象把所有的动物召集来开了个百兽大会,并发给他们每人一粒种子,叫他们埋到土里种起来,谁种出的花好看,谁就是国王,大象就用这种方法选出新国王。
所有的动物都把种子种下了地,他们精心照料着他们的种子,可是谁也没有种出来,机灵的小猴把种子换了,他的种子开出了鲜艳的花朵,小松鼠看见了,也纷纷效仿,就这样,一传十,十传百。
所有的动物都知道了,全换了种子,全都开出了美丽的花朵。
可小猴子却不知情,天天给花浇水施肥,可是还是没长出来。
大象把动物们再次召集起来,他发现就小猴子的种子没有开花,于是就说:“小猴子是个诚实的孩子,小猴子是新国王!”原来大象发给大家的是炒熟的种子,种子是种不出来的。
从此,小猴子治理的王国井井有序。
猴子选大王
![猴子选大王](https://img.taocdn.com/s3/m/14f6593b5727a5e9856a61bb.png)
[题目]第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); }。
猴子选大王——精选推荐
![猴子选大王——精选推荐](https://img.taocdn.com/s3/m/db2c9ab6294ac850ad02de80d4d8d15abf230053.png)
猴子选大王【问题】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来记录是顺序还是逆序报数,不太方便。
猴子当大王的寓言故事
![猴子当大王的寓言故事](https://img.taocdn.com/s3/m/5f5df25c1fd9ad51f01dc281e53a580216fc50f4.png)
猴子当大王的寓言故事(原创实用版4篇)目录(篇1)1.故事背景和角色介绍2.猴子成为大王的过程3.猴子大王的治理方式4.猴子大王的下场5.故事的寓意正文(篇1)在很久很久以前,有一片茂密的森林里,住着各种各样的动物。
它们和谐相处,共同维护森林的生态平衡。
在这片森林里,狮子是当时的大王,它公正而明智地统治着这片土地。
然而,有一天,狮子因年事已高,决定将王位传给有能力的动物。
猴子作为森林里的智者,被众多动物推举为大王的候选人。
在众多动物的期待中,猴子开始了它的大王之路。
然而,猴子成为大王后,却逐渐变得贪婪和自私。
它开始压迫其他动物,霸占资源,甚至不允许其他动物靠近它。
在猴子的统治下,森林的生态平衡逐渐被破坏。
动物们开始对猴子大王心生不满,森林里的和谐氛围不复存在。
猴子大王不仅没有意识到自己的错误,反而变本加厉地压迫动物们,甚至对其他动物实施暴力。
有一天,不堪忍受猴子大王压迫的动物们决定联合起来,推翻猴子的统治。
在众多动物的共同努力下,猴子大王被赶下了宝座,恢复了狮子的统治。
森林重新回到了和谐安宁的状态。
这个寓言故事告诉我们,权力和地位并不能让人变得伟大。
一个人或一个动物,只有心怀善念,关爱他人,才能赢得他人的尊重和敬仰。
当权力和地位用来满足私欲时,必将遭到众人的反抗和唾弃。
目录(篇2)1.猴子与森林中的其他动物2.猴子成为大王的过程3.猴子大王的统治4.猴子大王的下场正文(篇2)在很久很久以前,有一片富饶的森林里,住着各种各样的动物。
它们和睦相处,共同维护着森林的生态平衡。
在这片森林中,猴子以其聪明才智而闻名,它们不仅擅长攀爬,还拥有独特的模仿能力。
有一天,森林中的狮子国王因为年事已高,决定将王位传给一位有能力的动物。
于是,狮子国王召集了森林里的所有动物,宣布将举行一场比赛,选拔出新的国王。
这场比赛分为三个阶段,分别是智慧、力量和勇气。
经过激烈的比拼,猴子脱颖而出,以其卓越的表现赢得了狮子国王的认可。
猴子当国王寓言故事
![猴子当国王寓言故事](https://img.taocdn.com/s3/m/1e64d86fd4d8d15abf234e50.png)
猴子当国王寓言故事有一次,猴子在动物大聚会时跳起舞来,赢得了大家的好感,故而被选为动物之王。
然而,孤狸十分嫉妒猴子当选为王。
有一天,当他发现一个捕兽夹子里有一块肉时,便把猴子带过去说:“我发现这里有些好吃的东西,陛下,但是我没敢动用,因为我认为应该留给国王享用。
您能亲自去取吗?”猴子立刻跑过去拿,结果却被夹子夹住了。
他斥责狐狸陷害他,而狐狸却笑着说:“猴子,你这种笨蛋竟然还想做万兽之王!”【猴子当国王的寓意】新梦想提供的`这篇猴子当国王的寓言告诉我们,在任何时候都不能骄傲,否则就会落到像猴子一样的下场。
【猴子当国王英文版】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”。
猴子选大王_五年级作文
![猴子选大王_五年级作文](https://img.taocdn.com/s3/m/055995a650e2524de5187ec6.png)
猴子选大王
一天,猴子们集合在一个地方开会,会的内容是选一位大王来带领我们猴子群。
老猴汤尔说:“我年纪最大,经验也最丰富,猴子群就让我来带领吧!”猴子们大都没什么意见,只有小猴狒狒跳出来说:“不行不行,万一爷爷死了,那不是又得重新选过大王吗?这样太麻烦了!”听了狒狒的提示,猴子们都觉得狒狒说得对,大猴狒儿就接着提出了个新建议:“我们猴子会爬树,干脆大伙举行一个爬树比赛,谁赢了,谁就当大王吧!”猴子们听了这个建议,都异口同声地说“好!”,“那我们就把比赛定在五天后吧!”汤姆说,“这样就有时间练习了。
”在这段时间内,猴子都纷纷出来练习,有的上窜下跳,有的在做猴子自己创造的广播操,有的在跑步……一个个都在为五天之后的比赛做准备。
令猴子期待的日子终于来到了,猴子个个大显身手来爬树。
可是,令猴子大吃一惊的事情发生了,汤姆为了得第一名,在一棵树上使命地摇,导致自己站立的树枝断了,汤姆危在旦夕。
霎时,在一旁爬树的狒狒跳出树干,救出了汤姆,而比赛也只得了最后的一名。
可是,猴子们依然觉得狒狒来当大王比较合适,因为狒狒它“为猴善良”和“乐于助猴”。
爬树得了第一名的很后悔,后悔当初没有去救它。
瞧!猴子原来是群龙无首,现
第1页共1页。
Res_猴子选大王2
![Res_猴子选大王2](https://img.taocdn.com/s3/m/aefa7c641eb91a37f1115cc5.png)
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)循环控制结构。
猴子当大王的寓言故事的道理
![猴子当大王的寓言故事的道理](https://img.taocdn.com/s3/m/bbe6e771b5daa58da0116c175f0e7cd185251872.png)
猴子当大王的寓言故事的道理
1. 不要小瞧任何人或事物,哪怕是一只猴子也可能成为大王。
就像生活中那些曾经不被看好的人,最后却取得了巨大成功。
比如一个穷小子最后成了大企业家,这多神奇呀!
2. 机会随时可能降临,要做好准备。
想想看,猴子当大王不也是抓住了机会吗?就像那个平时默默努力的员工,突然有一天因为一个契机就升职了。
3. 有梦想就要去追,猴子都能当大王,我们为什么不行呢?就如同那个热爱画画的孩子,不顾别人嘲笑,最后成了知名画家,多了不起!
4. 不能以貌取人,猴子也有当大王的本事。
这就和那个其貌不扬的科学家一样,谁能想到他能有那么伟大的发明呢?
5. 团结的力量很强大,猴子们团结起来才能让它们的大王更有权威。
这和我们的团队合作不是一样吗?大家齐心协力才能获得成功。
6. 自信能让你走得更远,猴子要是不自信怎么能当大王呢?就像那个勇敢参加比赛的选手,相信自己能赢,最后真的做到了。
7. 勇于尝试新事物,猴子当大王也许就是一次大胆的尝试。
就好像那个第一次尝试跳伞的人,体验到了不一样的精彩。
8. 不要害怕失败,猴子当大王的路上肯定也经历过失败吧。
就如同创业失败多次但最终成功的人,不放弃就会有希望啊!
9. 要善于学习,猴子当大王也得不断学习进步呀。
就像我们不断学习新知识,才能让自己变得更优秀。
10. 保持乐观的心态,猴子能当大王不就是乐观面对一切吗?想想那些遇到困难依然微笑的人,多让人敬佩呀!。
猴子大王的故事的寓言
![猴子大王的故事的寓言](https://img.taocdn.com/s3/m/0e16129e0d22590102020740be1e650e52eacf25.png)
《猴子大王的故事的寓言》
小朋友们,今天给你们讲猴子大王的故事。
从前呀,有一群猴子生活在森林里。
它们想选一个大王。
有一只很聪明的猴子站出来说:“谁能爬上最高的树,谁就当大王。
”
好多猴子都去爬树,可都没成功。
这时候,一只小猴子轻轻松松就爬上了最高的树,大家就选它当大王啦。
可是这个大王呀,只知道自己玩,不管其他猴子。
后来,猴子们又重新选了一个关心大家的大王。
小朋友们,这个故事告诉我们,当大王要关心大家哟。
《猴子大王的故事的寓言》
小朋友们,咱们来讲猴子大王的故事。
森林里的猴子要选大王。
聪明猴子说爬最高树的当大王。
大家都去爬,没成功。
小猴子爬上去,当了大王。
可它不关心大家。
最后大家重选了。
小朋友们,当领导要关心别人呀。
《猴子大王的故事的寓言》小朋友们,听我讲猴子大王的故事。
猴子们选大王。
说爬高树的当。
都不行,小猴子行。
它当大王不管别人。
又重选啦。
小朋友们,要关心别人哟。
约瑟夫问题
![约瑟夫问题](https://img.taocdn.com/s3/m/5bb20d7627284b73f24250a3.png)
4、狐狸捉兔子
题目:
围绕着山顶有10个洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身于这十个洞中,你从10号洞出发,先到1号洞找,第二次隔1个洞找,第三次隔2个洞找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里?
参考程序下载
--------------------------------------------------------------------------------
5、进制转换
题目:
将一个十进制自然数转换成二进制数,一般采取除2取余法。从键盘输入一个十进制自然数(约定该数小于等于Maxlongint),输出相应的二进制数
设有一天平,可用来称物体的质量,同时给出一个正整数n(n<=10)。
问题1:试设计n个砝码的质量,用它们能称出尽可能多的1,2,3,...连续整数质量,约定砝码可以放在天平的左右两个托盘中的任何一个或两个中。例如n=2,此时设计2个砝码的质量分别为1,3,则能同时称取1,2,3,4。
问题2:在给出n个砝码能称出最大质量范围内的一个质量x,试给出称取x的方案。如上例中:
6/7,7/8,1/1
编程求出n级法雷序列,每行输出10个分数。n的值从键盘输入。
--------------------------------------------------------------------------------
13、砝码设计
题目:
①把组成这个四位数的4个数字由小到大排列,形成由这四个数字组成的最大的四位数;
②把组成这个四位数的4个数字由大到小排列,形成由这四个数字组成的最小的四位数(如果含有数字0,则不足四位);
脑筋急转弯猴子称大王(打一生肖)
![脑筋急转弯猴子称大王(打一生肖)](https://img.taocdn.com/s3/m/b7cca078793e0912a21614791711cc7930b77850.png)
脑筋急转弯猴子称大王(打一生肖)脑筋急转弯是孩子们喜闻乐见、百玩不厌的一种智力游戏。
它的设计宗旨就是突破思维定势,转换思考角度,求异、求新、求变,培养人们的创造能力和创新精神。
下面是店铺整理的脑筋急转弯,希望大家喜欢。
脑筋急转弯:猴子称大王(打一生肖)答案:猴子一孙悟空脑筋急转弯一:1. 假的不模仿 (打一成语)——答案:真才实学2. 喝冷饮 (打一现代作家)——答案:谢婉莹3. 蹦蹦跳跳进考场 (打一成语)——答案:跃跃欲试4. 绝不短斤少两 (打二字礼貌用语)——答案:保重5. 一个漂亮女人和帅老公生了一个丑孩子(打一成语)——答案:物极必反6. 何须养儿防老 (打一体育项目)——答案:女子足球7. 开封府里青天怒 (打一字)——答案:炮8. 地上练习泳 (打一南宋人名)——答案:陆游9. 坐车规则 (打二字数学名词)——答案:乘法10. 馒头未熟别掀锅(打一成语)——答案:别开生面11. 夜半投宿难 (打一唐朝人名)——答案:白居易12. 夕阳西下几时回(打一成语)——答案:东山再起13. 室外竖天线,电视出图像。
(打一成语)——答案:立竿见影14. 阎王杯下蒙汗药 (打一字)——答案:魔15. 专业不熟悉(打三字教育用语)——答案:本科生16. 多次授课,懒批作业。
约瑟夫问题大全
![约瑟夫问题大全](https://img.taocdn.com/s3/m/d66727f69e31433239689313.png)
“约瑟夫”问题及若干变种林厚从例1、约瑟夫问题(Josephus)[问题描述]M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,再从下一个猴子开始继续1~ N报数,如此循环,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和N由键盘输入,1≤N,M≤10000,打印出最后剩下的那只猴子的编号。
例如,输入8 3,输出:7。
[问题分析1]这个例题是由古罗马著名史学家Josephus提出的问题演变而来的,所以通常称为Josephus(约瑟夫)问题。
在确定程序设计方法之前首先来考虑如何组织数据,由于要记录m只猴子的状态,可利用含m 个元素的数组monkey来实现。
利用元素下标代表猴子的编号,元素的值表示猴子的状态,用monkey[k]=1表示第k只猴子仍在圈中,monkey[k]=0则表示第k只猴子已经出圈。
程序采用模拟选举过程的方法,设变量count表示计数器,开始报数前将count置为0,设变量current表示当前报数的猴子编号,初始时也置为0,设变量out记录出圈猴子数,初始时也置为0。
每次报数都把monkey[current]的值加到count上,这样做的好处是直接避开了已出圈的猴子(因为它们对应的monkey[current]值为0),当count=n时,就对当前报数的猴子作出圈处理,即:monkey[current]:=0,count:=0,out:=out+1。
然后继续往下报数,直到圈中只剩一只猴子为止(即out=m-1)。
参考程序如下:program josephus1a {模拟法,用数组下标表示猴子的编号}const maxm=10000;var m,n,count,current,out,i:integer;monkey:array [1..maxm] of integer;beginwrite('Input m,n:');readln(m,n);for i:=1 to m do monkey[i]:=1;out:=0; count:=0; current:=0;while out<m-1 dobeginwhile count<n dobeginif current<m then current:=current+1 else current:=1;count:=count+monkey[current];end;monkey[current]:=0; out:=out+1; count:=0end;for i:=1 to m doif monkey[i]=1 then writeln('The monkey king is no.',i);readlnend.[运行结果]下划线表示输入Input m,n:8 3The monkey king is no.7 {时间:0秒}Input m,n:10000 1987The monkey king is no.8544 {时间:3秒}[反思]时间复杂度很大O(M*N),对于极限数据会超时。
第20章猴子选大王游戏
![第20章猴子选大王游戏](https://img.taocdn.com/s3/m/8da80b3e8e9951e79a892726.png)
20.2 问题分析及实现
➢ 20.2.1 问题分析 ➢ 20.2.2 问题实现 ➢ 20.2.3 程序运行
20.2 问题分析及实现
➢ 拿到这个算法问题,首先想到的前面提到的 要领:看清、想明、把握每一个细节。
猴子选大王游戏
➢ 猴子选大王(亚瑟夫环)是数据结构和算法 中常见的一类问题。有人使用循环队列实现, 有人使用链表实现。本章将使用数组的回溯 算法实现选猴王的算法程序。
20.1 问题描述
➢ 有M只猴子围成一圈,每只各一个从1 到M中的编号,打算从中选出一个大王; 经过协商,决定出选大王的规则:从第 一个开始循环报数,数到N的猴子出圈, 最后剩下来的就是大王。
11
printf("%d ",Monkey[i]); /*让猴子站成一圈*/
12 printf("\n");
13 }
20.2.2 问题实现
➢ 2. 将结果输出 ➢ 将回溯结果输出至屏幕,以循环打印的方式,
调用标准输入输出函数printf,将结果回显。 代码如下(代码20-2.txt)
20.2.2 问题实现
20.2.2 问题实现
➢ 本小节就通过编程来实现此问题,实现的代 码如下。
➢ 1. 让猴子站成一圈 ➢ 如何让猴子站成一圈呢?根据问题分析结n 果,
采用整型一n维数组中保存猴子顺序号n,即表 示站成一排。代码如下(代码20-1.txt)。
20.2.2 问题实现
01 #include<stdio.h>
第20章
猴子选大王游戏
问题描述 问题分析及实现 开发过程常见问题及解决
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/d0443499763231126fdb111e.png)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n()i n t n,m,a[101],k,i,j,n um; //计数器是从1开始的,所以100个人用101 c o u t<<"请输入参加游戏的玩家人数(不超过100人):";c i n>>n;c o u t<<"----------------------------------------"<<e nd l;i f(n>100){c o u t<<"玩家太多,请重新登陆此程序!"<<e nd l;r e t u r n;}c o u t<<"输入游戏中要玩的数字:";c i n>>m;c o u t<<"----------------------------------------"<<e nd l;f o r(i=1;i<=n;i++){ a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,}j=0;k=0;f o r(i=1;i<=n+1;i++){i f(a【i】==1){j=j+a【i】;i f(j==m)j=0;a【i】=0;k++;}i f(k==n){n u m=i;b r e a k;}}i f(i==n+1)i=0;}c o u t<<"最后获胜的玩家是第"<<n u m<<"号玩家!"<<e nd l;c o u t<<"----------------------------------------"<<e nd l;}写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法很巧妙很简单不过只能推出最后一个出列的人无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
猴子选大王
![猴子选大王](https://img.taocdn.com/s3/m/9638978b680203d8ce2f24e4.png)
一. 需求分析:猴子选大王是一个小游戏,其规则是:假设n个猴子围成一堆,取数字m为将要被淘汰的数字,从第一个猴子开始数,数到数字m时,则该猴子出列,被淘汰,然后从被淘汰的猴子的下一个开始数,再数到数字m时,这个猴子也被淘汰,从下一个开始数,依次进行,直到剩下一个猴子结束。
该猴子即猴子大王。
二. 概要设计:该程序没有抽象数据类型,主要用循环和数组实现,先用数组存放猴子,假定一个猴子的最大个数,再通过参数传递一个正确的猴子(将要做游戏的猴子数),先将猴子初始化为0,用一个计数器存countone存放剩余的猴子的个数,用sum存放数字,即从1到m 的数字,当countone>0时,进行循环,先将countone记为0,当循环等于m时,一次循环结束,否则countone加1,依次进行第二次的循环,直到剩下一个猴子为止,并记下当m!sum是的猴子,为幸运猴子大王。
三. 详细设计:int choose(int num,int del) //num表示猴子总数,del表示将要被淘汰的猴子总数{for(i=0;i<num;i++)a[i]=1; //猴子初始化,为1表示还有希望被选为大王while(countOne>1) //是否进行继续淘汰的判断,其中放剩余的猴子个数{countOne=0;for(i=0;i<num;i++){sum+=a[i];if(sum==del) //del同时也记录了每次数数的结束sum=a[i]=0; //淘汰倒霉猴子;countOne+=a[i]; //是和if相匹配语句,当判断条件不成立时执行}for(i=0;i<num;i++)if(a[i]!=0)return i; //找到幸运猴子编号(从0开始的);}void main(){int num,del;cout<<"请输入猴子总数和淘汰数字:";cin>>num>>del;cout<<"第"<<choose(num,del)+1<<"个猴子为王!"<<endl;}四.调试分析:输入猴子总个数,在输入将要淘汰的猴子的个数时,能正确输出所选的大王猴子,调试正确无误。
约瑟夫问题
![约瑟夫问题](https://img.taocdn.com/s3/m/ad09c8dc5022aaea998f0fbc.png)
【问题描述-猴子选大王】:M只猴子要选大王,选举办法如下:所有猴子按1-M编号围坐一圈,从1号开始按顺序1,2,,,K报数,凡报到K的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和K由输入文件提供,要求在输出文件中打印出最后剩下的猴子的编号。
数据规模(M<=1000,K<=10)【题目分析】这是一个约瑟夫问题,拿到题目后,想到了如下几种算法:第一个想到的就是穷举,一个一个累加,并进行组合删除。
但是此种算法浪费大量时间,可以应对小数目的运算,无法完成大规模的运算。
只能借助高速运行的计算机来提速。
其次是队列,把所有的猴子看成为一对,从第1只开始,1-M报数,每逢M出列,猴子数减一,再把后面的猴子提前。
减去不计的原则,进行运算。
并在开始时获取时间,最后获取时间,做时间差,得到运算时间。
次算法可以在猴子删除时及时剔除,避免了时间的浪费以及内存的占用,与第一种方法相比较,更适合在小内存,低速度的计算机上运行。
第三是栈,把所有的猴子压入一个栈,然后将所有猴子一个一个弹出,并在这个过程中对猴子进行删除,之后再将猴子从新压入站内进行弹出删除。
此种算法充分利用了结构模型栈,但是在运算过程中,需要花费近一把的时间对猴子进行压入操作。
其灵活性远不如队列。
【程序实例】穷举:#include<iostream>#include<fstream>using namespace std;ifstream infile("猴子选大王.in.txt");ofstream outfile ("猴子选大王.out.txt");int main(){clock_t cstart,cends; *//获取时间函数int a[50000],i,j,b=0,n,x,y,z; *//定义所需要变量infile>>x>>y>>z; *//文件输入变量 cstart=clock(); *//获取时间for(i=0;i<x;i++) *//赋值a[i]=i+1;i=z-1;b=0;j=x;while(j>1){i++; *//向后数i=i%x; *//保证区间b++; *//间隔数目if(a[i]==0){b--;continue;} *//如果没有返回继续if(b==y){a[i]=0;b=-1;j--;} *//如果有标记}for(i=0;i<x;i++) *//循环输出if(a[i]!=0){outfile<<a[i];outfile<<endl;break;}cends=clock(); *//获取结束时间outfile << "耗时:" << cends-cstart << endl; *//时间差输出return 0;}队列:#include<iostream>#include<fstream>using namespace std;ifstream infile("猴子选大王.in.txt");ofstream outfile("猴子选大王.out.txt");int main(){clock_t cstart,cends;int a[100000],i,j,b,x,y,z,k,m;infile>>x>>y>>z;cstart=clock(); for(i=0;i<x;i++)a[i]=i+1;i=z;m=j=x;while(m>1){k=0;if(i>=j)i=i%j;m=j;for(;i<j;i++){if((i-i)%y==0) {k++;m--;}a[i]=a[i+k];}i=i-k;j=m;}outfile<<a[0]<<endl;cends=clock();outfile << "Clock时间差:" << cends-cstart << endl;return 0;}。
课程设计猴子选大王
![课程设计猴子选大王](https://img.taocdn.com/s3/m/e1506ea7760bf78a6529647d27284b73f2423681.png)
课程设计猴子选大王一、教学目标本课程旨在通过《猴子选大王》的故事,让学生掌握成语“猴子选大王”的含义和用法,了解中国传统文化中的成语故事,培养学生的阅读兴趣和语言表达能力。
1.学生能够理解并正确使用成语“猴子选大王”。
2.学生能够讲述《猴子选大王》的故事内容。
3.学生能够了解成语背后的中国传统文化。
4.学生能够通过阅读和讨论,提高自己的语言表达能力。
5.学生能够运用成语“猴子选大王”进行句子创作。
情感态度价值观目标:1.学生能够培养对中国传统文化的兴趣和认同感。
2.学生能够通过学习成语故事,培养正确的价值观和道德观念。
二、教学内容本课程的教学内容以《猴子选大王》的故事为主线,通过讲解成语的含义和用法,引导学生了解中国传统文化中的成语故事。
1.导入:介绍成语“猴子选大王”的由来和含义。
2.新课内容:讲解《猴子选大王》的故事情节,分析成语的用法。
3.练习:学生进行成语接龙游戏,巩固所学内容。
4.拓展:引导学生思考成语在现实生活中的应用,进行案例分析。
教材章节:《猴子选大王》故事及相关练习。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:教师讲解成语的含义和用法,引导学生理解故事内容。
2.讨论法:学生分组讨论成语的用法和现实生活中的应用。
3.案例分析法:教师提供案例,引导学生分析成语在案例中的作用。
4.实验法:学生进行成语接龙游戏,提高语言表达能力。
四、教学资源本课程所需教学资源包括:1.教材:《猴子选大王》故事及相关练习。
2.参考书:提供有关成语和中国传统文化的参考资料。
3.多媒体资料:图片、视频等辅助教学资料。
4.实验设备:成语接龙游戏所需道具。
教学资源的选择和准备应充分支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估本课程的评估方式包括平时表现、作业和考试,以全面客观地反映学生的学习成果。
1.平时表现:通过观察学生在课堂上的参与度、讨论和提问,评估学生的学习态度和理解程度。
猴子选大王问题
![猴子选大王问题](https://img.taocdn.com/s3/m/9b3eeca09b89680203d825eb.png)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n(){i n t n,m,a[101],k,i,j,n u m;.n-2,n-1,0,1,2,...k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k-->0 k+1--> 1k+2--> 2......k-2-->n- 2k-1-->n- 1 变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)m o d n 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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语言来实现课题,但由于有些东西有点模棱两可,所以在网上和书上找了一些别人用过的函数和借用了一些算法思想,来完成初代码。
特别是在写遍历链表时,由于在学数据结构的时候,都没怎么弄懂,所以,在写这一部分的代码时,都是借用别人的。