【转】猴子称大王问题算法

题目:一堆猴子都有编号,编号是123 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王

解题思路:将围成一圈的m只猴子看作是一个循环链表,从第一个节点(猴子)开始移动(数),到第n个节点(猴子),将它删除,然后从后面一个节点(猴子)继续移动,并从1重新开始计数……直到循环链表中只剩一个节点(猴子)

算法描述:

 

1 LinkNode *cl; //定义一个循环表,指向头节点
2  
3 LinkNode *tcl; //定义一个临时指针
4  
5 tcl=cl;//指向头节点
6
7 while ( Lenth(*cl)>1)//直到链表长度为1
8
9 {
10
11 for(int i=1;i<=n;i++)//数数1-n
12
13 {
14
15 if(i!=n)
16
17 {tcl=tcl->next;}//不是n往后移动指针
18
19 else//是n
20
21 {
22
23 printf : tcl->next->Num monkey leaves. // 显示编号num的猴子离开
24
25 tcl->next=tcl->next->next; //删除该节点
26
27 tcl=tcl->next;//移动到下一个
28
29 cl=tcl;//重新指定循环列表头节点
30
31 }
32
33 }
34
35 }

原文

http://www.cnblogs.com/enuosky/archive/2008/07/16/1244589.html

posted on 2011-04-12 13:05  Osiris_Syou  阅读(369)  评论(0编辑  收藏  举报

导航