约瑟夫问题的C++简单实现(循环链表)

[code=C++]

/*

author:jiangxin

Blog:http://blog.csdn.net/jiangxinnju

Function:method of Josephus question

*/

#include <iostream>

using namespace std;

struct node

{

int seq;

node *next;

};

typedef struct node NODE;

void test_Josephus()

{

/*假设共有n人,从第s个人开始数数,每数到m该人出列,后面的人重新开始数,知道全部人出列*/

int n,s,m;

NODE *head,*last,*current,*prev;

cout << "Input the n,s,m(separate with space):";

cin >> n >> s >> m;

for(int i=1;i<=n;i++) //建立循环链表

{

current = new NODE;

current->seq = i;

current->next = head;

if(i == 1)

{

head = current;

last = current;

}

else

{

last->next = current;

last = last->next;

}

}

current = head; //遍历循环链表,输出序列

do

{

cout << current->seq << " ";

current = current->next;

}while(current!=head);

current = head; //将current置于第s个位置

for(int i=1;i<s;i++)

{

current = current->next;

}

cout << endl;

for(int i=1;i<=n;i++) //共循环n轮,得到一个整体的输出序列

{

for(int j=1;j<m;j++)

{

prev = current;

current = current->next;

}

cout << current->seq << " ";

prev->next = current->next;

delete current;

current = prev->next;

}

}

[/code]

约瑟夫问题的C++简单实现(循环链表)

时间: 2025-01-07 13:21:20

约瑟夫问题的C++简单实现(循环链表)的相关文章

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

华为面试题——约瑟夫问题的C++简单实现(循环链表)

/* author:jiangxin Blog:http://blog.csdn.net/jiangxinnju Function:method of Josephus question */ #include <iostream> using namespace std; struct node { int seq; node *next; }; typedef struct node NODE; void test_Josephus() { /*如果共同拥有n人.从第s个人開始数数,每数到

一道约瑟夫算法题的简单设计

说约瑟夫问题,网上是有一大堆各种各样的文章,想必也给出了各种各样的代码,但这却不能阻挡我写这篇博文的心啊,要知道我才刚刚开通个博客不写点什么总觉得空虚.... 那么就先来讲一下我所要解决的问题:N个人围坐成一圈,从1开始顺序编号:游戏开始,从第一个人开始由1到m的顺序报数,报道m的人退出圈外,问最后留下来那个人原来的序号. (百度了一下发现,原题目不是推出圈外而是"39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式"...) 好吧回归正题,我们继续讲这个算法. 在这里我们用

C++循环链表解决约瑟夫环问题

约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法) 这道面试题考察了循环链表的“创建”,

用单向循环链表实现约瑟夫环问题

约瑟夫环的问题和种类有很多,这是一道基本的约瑟夫环问题,通过单向循环链表实现模拟此过程. 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Node { int num; int password; struct Node *next; }CircleNode,*CircleList; CircleList Create(int n); void Knockout(CircleList L,int n,int m);

单向循环链表

一,循环链表的概念 1.什么是循环链表 所谓的循环链表就是让单向链表的首尾相连,组成一个环状. 2.循环链表的典型应用 约瑟夫环问题. 3.实现循环链表的重点 1,循环链表在插入第一个元素的时候,需要我们将第一元素的指针域指向其自身,也就构成了循环链表. 2,循环链表基于单向链表而生,单是比循环链表多了游标这个概念.要想实现循环链表的插入,删除的关键是考虑头结点问题,因为在头插法方式(往链表的头部插入数据)中,需要将末尾数据元素的指针域指向新插入的节点.将新插入的节点的指针域指向头结点的指针域的

数据结构8: 双向链表(双向循环链表)的建立及C语言实现

之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”. 如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率.为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额外配备一个指针变量,用于指向每个结点的直接前趋元素.这样的链表被称为“双向链表”或者“双链表”. 双链表中的结点 双向链表中的结点有两个指针域,一个指向直接前趋,一个指向直接后继.(链表中第一个结点的

递推公式法解决约瑟夫问题

约瑟夫问题的描述: n个人围成一圈,第一个人从1开始报数,报m的将被杀掉,下一个人接着从1开始报.如此反复,最后剩下一个,求最后的幸存者的编号(编号从零开始). 如果需要知道每一轮被杀掉的人的编号的话,最好的方法可能是使用链表.不过如果只需要知道最后幸存者的编号的话,链表法的时间复杂度是无法接受的,使用递推公式解决这题会快很多. 递推公式百度一下你就知道,但关键是这个递推公式是如何推导出来的呢? 我们的目的当然是希望能用m和n表示出最后的幸存者的编号,但不幸的是这很难直接办到.但是用m和n表示出

剑指offer算法总结

剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看了几遍多做了几遍多了点心得体会.于是想总结一下.如果有错误也希望能指出,谢谢. 具体代码可以参考我的GitHub仓库: https://github.com/h2pl/SwordToOffer 数论和数字规律 从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的