C++循环链表解决约瑟夫环问题
约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题。
什么是约瑟夫环?
“约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法)
这道面试题考察了循环链表的“创建”,“遍历”和“删除”。
源代码如下:
#include<iostream>
using namespace std; struct MyNode
{
MyNode(int a_data):m_data(a_data),m_pNext(NULL){}
int m_data;
MyNode *m_pNext;
};
class Josephus
{
public:
Josephus(int a_N,int a_K,int a_M):m_N(a_N),m_K(a_K),m_M(a_M){
createList();
outputList();
}
protected:
void createList();
void outputList();
private:
MyNode *m_pHead; //循环链表的头节点
int m_N; //链表节点个数
int m_K; // 第一个报数人的序号
int m_M; // 报数出局的数
};
void Josephus::createList()
{
MyNode *pre = NULL;
MyNode *cur = NULL;
MyNode *p = new MyNode();
m_pHead = p;
cur = p;
for(int i=; i<=m_N;i++)
{
p = new MyNode(i);
pre = cur;
cur = p;
pre->m_pNext = p;
}
cur->m_pNext = m_pHead;
int n = m_N;
p = m_pHead;
cout << "初始序列为:" << endl;
while(n--){
cout << p->m_data << ",";
p = p->m_pNext;
}
cout << endl;
}
void Josephus::outputList()
{
// 让pStart指向第一个报数人的序号
MyNode *pStart = m_pHead;
int count = ;
while(count < m_K){
pStart = pStart->m_pNext;
count++;
}
MyNode *pTemp = pStart;
MyNode *pPre = NULL;
MyNode *tobeDeleted = NULL;
cout << "依次出局的序列为:" << endl;
while(pTemp->m_pNext!=pTemp) // when pTemp->m_pNext==pTemp only one node in the list
{
int count = ;
while(count < m_M){
pPre = pTemp;
pTemp = pTemp->m_pNext;
count++;
}
tobeDeleted = pTemp;
pTemp = pTemp->m_pNext;
pPre->m_pNext = pTemp;
cout << tobeDeleted->m_data << ",";
}
cout << pTemp->m_data << endl;
} int main()
{
int total_people;
int start;
int step;
cout << "请输入总人数:" << endl;
cin >> total_people;
cout << "请输入开始数的人:" << endl;
cin >> start;
cout << "请输入出局人数的数:" << endl;
cin >> step;
Josephus josephus(total_people,start,step);
return ;
}
运行程序结果如下:

C++循环链表解决约瑟夫环问题的更多相关文章
- golang数据结构之用循环链表解决约瑟夫环问题
josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...
- javascript中使用循环链表实现约瑟夫环问题
1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...
- 循环列表的Java实现,解决约瑟夫环问题
import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...
- php解决约瑟夫环的问题
php里面解决约瑟夫环还是比较方面的,但是下面的方法太费空间 <?php class SelectKing{ private $m;//幅度 private $n;//总数 public fun ...
- PHP解决约瑟夫环问题
PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...
- 单向环形链表解决约瑟夫环(Josephus)问题
一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...
- C语言单向循环链表解决约瑟夫问题
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,4 ...
- Java循环链表实现约瑟夫环(搬运)
public class Josephus { static class Node{ int val; Node next; Node(int v){ val=v; } }//成员类,代表节点,类似于 ...
- 10行Python代码解决约瑟夫环(模拟)
http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 #!/usr/bin/env python # coding: utf ...
随机推荐
- 获取http和ftp地址的图片
根据http和ftp图片地址获取对应图片的缩略图和原图 public class GetBitmapImageClass { public BitmapSource GetImageHttp(stri ...
- Proving Equivalences UVALive - 4287(强连通分量 水题)
就是统计入度为0 的点 和 出度为0 的点 输出 大的那一个,, 若图中只有一个强连通分量 则输出0即可 和https://www.cnblogs.com/WTSRUVF/p/9301096.htm ...
- BZOJ 3786: 星系探索 解题报告
3786: 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅 ...
- MSF下ms17_010_psexec模块使用技巧
0x01 前言 MS17-010 的psexec是针对Microsoft Windows的两款最受欢迎的漏洞进行攻击. CVE-2017-0146(EternalChampion / EternalS ...
- linux内核分析第3章&第18章读书笔记
linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...
- 阿里云ECS环境部署 centos 6.5
阿里云ESC服务器1 先挂载磁盘 参考:http://help.aliyun.com/view/11108189_13491193.html?spm=5176.2020520101.121.2.1wc ...
- 【loj2033】生成魔咒
Portal --> loj2033 Solution 这题..虽然说好像也是sam的裸题不过既然在智力康复那就强制后缀数组吧qwq (晚点再用sam写一次qwq) 首先如果是要求本质不同的 ...
- ios错误码:NSError对象.code
1. URL Loading System Error Codes These values are returned as the error code property of an NSError ...
- [树莓派]wifi在面板看不到,但是可以scan到的解决方案
突然遇到一个问题,发现在wifi面板中找不到WiFi,但是运行scan命令可以发现WiFi,多方查找资料终于找到了一个解决方案: 运行如下命令: sudo apt-get install wicd ...
- 用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...