码迷,mamicode.com
首页 > 其他好文 > 详细

寒假项目2-猴子选大王

时间:2015-01-30 22:58:16      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:c++   iostream   namespace   编程   博客   

/* 

* Copyright (c) 2014, 烟台大学计算机学院 
* All rights reserved. 
* 文件名称:test.cpp 
* 作    者:刘畅 
* 完成日期:2015 年 1  月  30  日 
* 版 本 号:v1.0 
* 
* 问题描述:一群猴子,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈。从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。输入m和n,输出为大王的猴子是几号。  
* 输入描述:输入猴子的个数m和被提出的数n
* 程序输出:输出为大王的猴子号码。

提示1:(1)链表解法:可以用一个循环的单链表来表示这一群猴子。表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链。当数到第n个时,该结点被删除,继续数,直到只有一个结点。(2)使用结构数组来表示循环链:结构体中设一个成员表示对应的猴子是否已经被淘汰。从第一个人未被淘汰的数起,每数到n时,将结构中的标记改为0,表示这只猴子已被淘汰。当数到数组中第m个元素后,重新从第一个数起,这样循环计数直到有m-1被淘汰。
提示2:该题为计算机科学中的经典问题,很多实际的问题可以抽象到这种模型上来。感兴趣的同学请搜索“约瑟夫问题”

代码如下:

#include <iostream>
using namespace std;
struct Node
{
    int num;                         //猴子的编号
    Node *next;                       //下一只猴子
};

int main()
{
    int m,n,i,j,king;
    Node *head, *p,*q;
    cin>>m>>n;
    if(n==1)
    {
        king=m;
    }
    else                                 //建立猴子围成的圆圈
    {
        p=q=new Node;
        head = p;
        head->num=1;
        for(i=1,p->num=1; i<m; i++)      //其余m-1只猴子
        {
            p=new Node;                  //p是新增加的
            p->num=i+1;
            q->next=p;
            q=p;                         //q总是上一只
        }
        q->next=head;                     //最后一只再指向第一只,成了一个圆圈

        //下面开始数了
        p=head;
        for(i=1; i<m; i++)                //循环m-1次,淘汰m-1只猴子
        {
        //从p1开始,数n-1只就找到第n只了
            for(j=1; j<n-1; j++)         //实际先找到第n-1只,下一只将是被淘汰的
                p=p->next;               //围成圈的,可能再开始从第一只数,如果还未被淘汰的话

            //找到了,
            q=p->next;                   //q将被删除
            p->next=q->next;             //q就这样被“架空了”
            p=q->next;                   //下一轮数数的新起点
            delete q;                    //将不在链表中的结点删除
        }
        king=p->num;
        delete p;
    }
    cout<<king<<endl;
    return 0;
}


运行结果:

技术分享

示例推理:

技术分享


链表真心没大弄明白,对照老师的一步一步来做也还是有很多地方没弄明白,靠自己再写肯定还是写不出来的T.T。努力吧!

寒假项目2-猴子选大王

标签:c++   iostream   namespace   编程   博客   

原文地址:http://blog.csdn.net/liuchang54/article/details/43307059

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!