用循环单链表实现约瑟夫环

题目:n个人编号分别是1,2,3,...,n,围坐在一张圆桌周围,从编号为k的人开始报数,数到m的人出列。然后他的下一个人开始报数,数到m的那个人又出列;依次循环,直到所有人出列。


struct LNode{
int data;
LNode *next;
};

//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
void solve(int k,int m, int n)
{
if(k>n || n<=0 || m<=0)
{
throw "Invalid argument(s)";
}

//建立循环链表
LNode *p = new LNode;
p->data = 1;
p->next = p;

LNode *curr = p;

for(int i=2;i<=n;i++)
{
LNode *q = new LNode;
q->data = i;
p->next = q;
q->next = curr;
p=p->next;
}

//把当前指针移动到第一个报数的人
while(--k)
{
curr = curr->next;
}
LNode *pre;
int m1=m;
while(n--)
{
while(--m1)
{
pre = curr;
curr = curr->next;
}
m1 = m;
cout<<curr->data<<" ";
pre->next = curr->next;
delete curr;
curr = pre->next;
}

}

int main()
{
solve(2,2,4);
return 0;
}

注意:while(k--)比while(--k)多循环一次,在循环体中k值大小相同。

用循环单链表实现约瑟夫环,布布扣,bubuko.com

时间: 2024-12-22 17:43:56

用循环单链表实现约瑟夫环的相关文章

C/C++,数据结构单链表实现约瑟夫环

约瑟夫环--围成一圈,定义一个数值K,从任意位置开始计数,每走K步删除当前位置结点,直到剩下最后一个结点,求最后一个结点 //单链表结构以及Find函数参见 2016-1-2 13:56 发表博客 SListNode* Joseph(SListNode *&pos, int K) //约瑟夫环 {  assert(pos);  if (K > 0)  {   SListNode *tmp = pos;   while (1)   {    int count = K;    while (-

单链表 --- 冒泡排序 约瑟夫环

1.冒泡排序: void BubbleSort(ListNode *&pHead)//冒泡排序 { ListNode *tail=NULL; assert(pHead!=NULL&&pHead->_next!=NULL); while(tail!=pHead->_next) { ListNode *prev=pHead; ListNode *cur=pHead->_next; while(cur!=tail)   //单次排序 { if(prev->_dat

Problem E: 用链表实现约瑟夫环

Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这个人就要踢出比赛,然后从被踢出的人的下一个人开始,重新报数(从1开始).这样经过n-1次后,就只剩下了一个人,问最后剩下的那个人是几号? Input 第1行为T,表示有T组数据: 第2行到第T+1开始,每行输入n和m,n表示有几个人,m为上述的每报数m次就要踢出一个人 1=<n<=100, 1=<m<=1

猴王问题约瑟夫环

[Joseph问题描述]n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. [求解思路]我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0. 现在我们把他们的编号做一下转换: k --> 0 k+1 --> 1 k+2 --> 2 ... ... k-2 --&

约瑟夫问题、约瑟夫环

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".) 1问题来历编辑 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Jos

一个小笔记(3):约瑟夫环

什么是约瑟夫环?其实百度有说http://baike.baidu.com/view/717633.htm 以一个传说中的问题为例子,提供源代码主要是能够通过这个问题,了解如何来操作循环链表 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.

uva live 3882 And Then There Was One 约瑟夫环

// uva live 3882 And Then There Was One // // 经典约瑟夫环问题.n是规模,k是每次数的人数,m是第一个出列的人. // // 但是暴力用链表做肯定是不行的,因为 1 <= n <= 10000 , 1<= k <= 10000 // 1 <= m <= n; 虽然我知道公式是什么,但是我并不会推导,看了几乎一个下午的 // 数学推导过程,又弄了几个样例亲自动手实验一下,这样才算是有了一点明悟. // 下面来分享一下自己能力范

php通过循环链解决约瑟夫环

本想着用php写些数据结构提升一下,写到链的时候看到约瑟夫环问题,尝试用循环链写了一下 约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列 代码: <?php header("Content-type: text/html; charset=utf-8"); /** * 约瑟

通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局......,如此反复直到所有人全部出局为止. 上一篇我们通过数组.静态链表实现了约瑟夫环,具体参考: 通过例子进阶学习C++(六)你真的能写出约瑟夫环么 本文,我们进一步深入分析约瑟夫环问题,并通过c++模板库实现该问题求解,最后我们说明