问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

约瑟夫环问题的C++算法,求用链表和递归两种方法,尽量详细!

发布网友 发布时间:2022-05-24 07:15

我来回答

1个回答

热心网友 时间:2023-10-08 16:41

#include <iostream.h>
typedef struct node {  //结点类型定义,每个结点表示一个孩子
    int data;   //用于存放结点(孩子)编号
    node *next;
    node(int _data = 0, node *_next = NULL)  //带缺省参数的结点构造函数

        : data(_data),next(_next)

    {}
}*PNode, Node, *JosephusCycle;

void InitJCycle(JosephusCycle &last, int n) {

//初始化一个含有n个孩子的约瑟夫环,用带尾指针last的单循环链表表示,建表时采用首插法。
    last = new Node(n);  //last指针始终指向表尾结点,先创建表尾结点
    last->next = last;  //先初始化只含一个结点的环。
    for(int i = n - 1; i > 0; i--)
        last->next = new Node(i, last->next); //将新结点插入到表头(即循环链表表尾的下一个)之前
}

int GetWinner(JosephusCycle &last, int k) { //第一种方法,返回剩下的最后这个孩子的编号
    if(last == NULL) return -1;  //如果为空环,则返回-1表示失败
    int sum; //报数器
    PNode prior = last, current = prior->next;//current表示当前报数结点,prior为当前结点的前驱
    while(prior != current) {//如果prior==current则意味着环中剩下一个孩子
        sum = 1; //报数开始
        while(sum < k) {  //进行报数,报数时,current指针与prior指针需同时移动
            prior = current;
            current = prior->next;
            sum++;
        }
        cout << current->data << "\t"; //将报到k的孩子的序号输出。接下来的两行是该孩子删除出环
        prior->next = current->next;
        delete current;
        current = prior->next; //重新定位当前孩子
    }  //end while,结束循环时,环中只剩最后一个孩子
    last = current;  //将环尾指针指向最后这个孩子
    return last->data;
}

int GetWinner(JosephusCycle &last, int n, int k) {

//方法二,递归,参数last是环尾指针,n表示环中孩子个数,k为报数的目标数
    if(n == 1) return last->data;  //如果环中只有一个孩子,则结束,并返回这个孩子的编号
    int sum = 1; //否则,则开始报数
    while(sum < k) {  //进行报数
        last = last->next;
        sum++;
    }  //结束while时,last->next即为报到k的孩子结点
    PNode p = last->next;//本行及后续3行是输出该孩子并删除该孩子
    cout << p->data << "\t";
    last->next = p->next;
    delete p;
    GetWinner(last, n - 1, k); //在剩下的n-1个孩子的环中继续找优胜者
}

void main( ) {
    JosephusCycle cycle;
    int m, k, winner;
    cin >> m >> k;

    cout << "方法一的出圈序列为:\n";
    InitJCycle(cycle, m);
    winner = GetWinner(cycle, k);
    cout << "\n优胜者:" << winner << endl;

    delete cycle;

    cout << "\n方法二的出圈序列为:\n";
    InitJCycle(cycle, m);
    winner = GetWinner(cycle, m, k);
    cout << "\n优胜者:" << winner << endl;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...爱你你是我的罗密欧 , 我愿意变成你的朱丽叶' 谁知 有句歌词是“我爱你你是我的朱丽叶,我愿意变成你的梁山伯”是哪... 为什么打印出来的文档页码和原来的不一样 ...两台电脑用路由器上网一台是W7一台是XP如何实现两台电脑共享文件 win7怎么联另一台电脑win7怎么让网络和另一台电脑共享 w7的系统怎么共享电脑w7系统里面文件怎么共享另一台电脑 共享win7电脑w7系统里面文件怎么共享另一台电脑 翡翠有收藏价值吗,我们玩家如何去投资 价格一两万元的翡翠如何挑选 ppt怎么转换成视频?简单四步法,轻松搞定ppt微课录制 C语言编程Josephus问题 描写解决约瑟夫问题的算法,按出列顺序组成新的表,然后再输出 Josephus环算法的设计 流程图 怎样用vb实现约瑟夫环算法?? josephus问题数据结构C 编写C语言算法,试编写一个求解Josephus问题的函数,用整数序列1, 2, 3, …… 约瑟夫环的算法原理 求解josephus问题的算法 什么是约瑟夫法则 用弹簧测力计探究动滑轮的省力特点的视频 弹力测力计的使用方法 如题 快影制作视频封面微信发却没有 sql group 后按分组数量的多少排序怎么写? 求助asp 中group by 的用法是什么啊!! 急!急!为什么有时用groupby结果还是显示同一个人的记录 sql group by 排序问题 sort by 和 group by 的区别是什么? SQL中的group by为什么是按照分组的第二个字段排序的呢? 怎样做网站优化,使其在搜索引擎中排名靠前。 男孩儿SEO博客:如何建立一个成功的品牌型的网站 设计单片机低频信号发生器,要求使用汇编语言,片选方式 josephus problem 约瑟夫环 C语言 试用循环链表为存储结构,写一个约瑟夫问题的算法。 求c++程序设计“约瑟问题”的算法 约瑟夫难题的约瑟夫指的是哪位约瑟夫? 《假面骑士W》免费在线观看完整版高清,求百度网盘资源 没有壳的蛋能否放进微波炉呢? 鸡蛋(没脱壳)为什么不能放在微波炉里叮呢? 一兆瓦是多少度 60版2元人民币的价格表? 60版2元纸币编号6888888有收藏价值吗? M1的USB接口在接普通U盘的时候可以识别,在接移动硬盘的时候不能识别 吉利星越L雷神Hi·X油电混动版12月25日预售 最大续航1300公里 吉利星越L雷神Hi·X油电混动版月底开售 最大续航1300公里 我的移动硬盘无法读取怎么回事 我的世界有没有办法隐藏章鱼 删除章鱼tv我看风云直播出现章鱼插件按装完成?怎样删掉它? 我原来看别人下载了个软件,图标是个红色的小章鱼 C# 的应用程序怎么打包成setup可执行文件, 发布之后要在没有安装.net framework 用inno setup打包安装工具生成的EXE程序,在安装的时出现【试图在初始化之前展开“app”常量】怎么解决? 关于vb的打包工具setup factory7.0的使用,请高手帮帮忙,谢谢!