1.算法描述
简单的游戏:有N个人坐成一圈,编号1-N、从编号为1的人开始传递热马铃薯。M次传递之后,持有马铃薯的人退出游戏,圈缩小,然后游戏从退出人下面的人开始,继续进行,最后留下的人获胜。如,M=0, N=5则参加游戏的人依次退出,5号获胜。M=1,N=5则退出顺序是2,4,1,5.
2.算法分析
该算法使用一个没有头指针的循环链表完成,移动的过程计数,如果计数为M,则将其移除并从下一位继续开始,否则继续。过程非常简单,主要考察指针的运用。当然还可以使用数组实现,不过移动所花费开销非常大!不推荐使用数组。
该算法的复杂度为O(n),直接对链表操作。
3.代码
#include <iostream>
#include <ctime>
using namespace std;
const int LNE = 100000;
struct Node{
Node *next;
int data;
};
//创建一个没有头结点的链表
Node* createList(int *a, int n){
Node* first = new Node;
first->data = a[0];
Node* t = first;
for(int i=1; i<n; i++){
Node* r = new Node;
r->data = a[i];
t->next = r;
t = r;
}
t->next = first;
return first;
}
//N个人,传递M次
int josephus(Node *l, int M, int N){
if(M<0 || N < 1) return -1;
if(M >= N) M %= N; //处理M
int count = 0; //用于计数
Node *p = l, *t;
//当M为0的时候处理方式,依次处理,最后一个人即是胜利者
if(M == 0){
while(1){
if(p->next == l) return p->data;
t = p;
//cout<<p->data<<" ";
p = p->next;
delete t;
}
}else{
//循环到只剩最后一个人
while(N != 1){
//计数到M之前的位置
if(count == M-1){
t = p->next;
//只剩最后元素,退出
if(t == p){
break;
}else{ //没有到最后一个
p->next = t->next;
//cout<<t->data<<" ";
delete t;
N --; //总人数减去1
}
count = -1;
}
p = p->next;
count ++; //计数器加1
}
}
return p->data;
}
int main(){
int *a = new int[LNE];
for(int i=0; i<LNE; i++){
a[i] = i+1;
}
int k;
Node *f = createList(a, LNE);
cout<<"输入传递次数:";
cin>>k;
time_t b = time(NULL);
cout<<endl;
cout<<"胜利者是:"<<josephus(f, k, LNE)<<endl;
time_t e = time(NULL);
cout<<"耗时:"<<e-b<<endl;
delete []a;
return 0;
}
分享到:
相关推荐
《Josephus问题与C语言实现解析》 在计算机科学领域,Josephus问题是一个经典的理论问题,它涉及到数学、算法和数据结构。此问题源于一个古老的传说:公元前73年,犹太人围困在马赛克城,为避免被罗马人俘虏,他们...
“一种利用labview求解Josephus问题的简单方法”表明该压缩包文件包含了一个使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench,实验室虚拟仪器工程工作台)编程解决Josephus问题的示例。...
《Josephus问题与C++程序实现详解》 Josephus问题,源自一个古老的传说,是由数学家Josephus Flavius提出的一个理论问题。在历史背景中,41个士兵被围困,他们决定每两人一组相互处决,最后一个幸存者会被释放。...
**Josephus问题** Josephus问题是一个著名的理论问题,源自罗马时期的犹太历史学家Flavius Josephus。在问题中,人们站成一个圈,并按照一定的顺序进行报数,每数到特定数字的人会被排除出圈,直到只剩下最后一个人...
教你如何用数据结构的思想来解决Josephus问题 而且是用C来描述的喔
在编程领域,经常会遇到一些经典算法问题,其中之一就是"约瑟夫斯问题"(Josephus Problem)。本篇将详细讲解如何使用LabVIEW来解决这个问题。 约瑟夫斯问题源自一个古老的传说,涉及一种生存游戏的策略。假设有n...
### Josephus问题资料知识点概述 #### 一、Josephus问题简介 Josephus问题是一个经典的理论计算机科学和数学问题,源自于犹太历史学家约瑟夫斯(Flavius Josephus)的一个故事。在这个问题中,n个人围成一个圈,并...
《Josephus问题与C++实现解析》 Josephus问题,源于古罗马历史学家Flavius Josephus的一个传说,是一个经典的理论计算机科学问题。在问题中,人们围坐在一个圆圈中,按照一定的规则进行淘汰,直到只剩下最后一个人...
用链式存储结构实现Josephus问题,用户按照执行提示输入n、s、m,输出题目要求的出列顺序
在C语言中实现Josephus问题,通常采用链表结构来模拟这一过程。 **链表实现** 在C语言中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据以及指向下一个节点的指针。对于Josephus问题,我们可以...
《Visual C++ 实现Josephus问题详解》 Josephus问题,源自古罗马历史学家Flavius Josephus在《犹太战争》中描述的一个历史事件,后来被转化为一个经典的理论问题。该问题通常表述为:一群人站成一个圈,每隔一定的...
Josephus问题,又称为“约瑟夫环”或“丢手绢问题”,是一个经典的计算机科学和数学问题。这个问题的起源有一个古老的故事背景,但与解决问题的具体算法设计并无直接关联。以下是Josephus问题的详细描述和一种可能的...
### Josephus问题详解 #### 一、问题背景与描述 Josephus问题是一个历史悠久且非常经典的数学和计算机科学问题。该问题通常被描述为一个约瑟夫斯环形问题:有n个人(编号从1到n)围坐成一个圈,从第一个人开始报数...
《Josephus问题的顺序表实现》 Josephus问题是一个经典的理论问题,源于古罗马时期的战争策略,后来被数学家Josephus Flavius提出并成为数学和计算机科学领域的一个经典问题。该问题通常描述为:在圆形排列的人群中...
设有n个人围坐一圈并由1到n编号,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新1到n报数,数到m的人又出列,如此反复地报数和出列,直到最后一个人出列为止,设计确定这n个人出列序列的程序
《Josephus问题与向量实现解析》 Josephus问题,源于古罗马时期的历史事件,是一个经典的理论问题,常被用于探讨计算机科学中的算法设计。在该问题中,人们站成一个圈,按照一定的顺序每固定人数后淘汰一人,直至只...
《Josephus问题的C语言实现:链表与向量法》 Josephus问题,源于古罗马历史上的一个典故,是一个经典的理论计算问题,通常被用于探讨和研究循环链表、数组以及递归算法等数据结构与算法概念。在本实验报告中,我们...
Josephus问题,也称为“约瑟夫环”或“丢手绢问题”,是一个在计算机科学和数学中经典的问题。以下是对Josephus问题的清晰回答: 问题背景 Josephus问题的起源可以追溯到罗马人占领乔塔帕特后,39个犹太人与...