`
hao3100590
  • 浏览: 131232 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Josephus问题

阅读更多

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问题.zip

    《Josephus问题与C语言实现解析》 在计算机科学领域,Josephus问题是一个经典的理论问题,它涉及到数学、算法和数据结构。此问题源于一个古老的传说:公元前73年,犹太人围困在马赛克城,为避免被罗马人俘虏,他们...

    一种利用labview求解Josephus问题的简单方法

    “一种利用labview求解Josephus问题的简单方法”表明该压缩包文件包含了一个使用LabVIEW(Laboratory Virtual Instrument Engineering Workbench,实验室虚拟仪器工程工作台)编程解决Josephus问题的示例。...

    Josephus问题c++程序

    《Josephus问题与C++程序实现详解》 Josephus问题,源自一个古老的传说,是由数学家Josephus Flavius提出的一个理论问题。在历史背景中,41个士兵被围困,他们决定每两人一组相互处决,最后一个幸存者会被释放。...

    Josephus问题C++单循环链表实现

    **Josephus问题** Josephus问题是一个著名的理论问题,源自罗马时期的犹太历史学家Flavius Josephus。在问题中,人们站成一个圈,并按照一定的顺序进行报数,每数到特定数字的人会被排除出圈,直到只剩下最后一个人...

    Josephus问题.cpp

    教你如何用数据结构的思想来解决Josephus问题 而且是用C来描述的喔

    labview的josephus问题编程

    在编程领域,经常会遇到一些经典算法问题,其中之一就是"约瑟夫斯问题"(Josephus Problem)。本篇将详细讲解如何使用LabVIEW来解决这个问题。 约瑟夫斯问题源自一个古老的传说,涉及一种生存游戏的策略。假设有n...

    Josephus问题资料

    ### Josephus问题资料知识点概述 #### 一、Josephus问题简介 Josephus问题是一个经典的理论计算机科学和数学问题,源自于犹太历史学家约瑟夫斯(Flavius Josephus)的一个故事。在这个问题中,n个人围成一个圈,并...

    josephus问题源代码

    《Josephus问题与C++实现解析》 Josephus问题,源于古罗马历史学家Flavius Josephus的一个传说,是一个经典的理论计算机科学问题。在问题中,人们围坐在一个圆圈中,按照一定的规则进行淘汰,直到只剩下最后一个人...

    (C++)Josephus问题---链式存储结构

    用链式存储结构实现Josephus问题,用户按照执行提示输入n、s、m,输出题目要求的出列顺序

    Josephus 问题的 C 语言代码

    在C语言中实现Josephus问题,通常采用链表结构来模拟这一过程。 **链表实现** 在C语言中,链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据以及指向下一个节点的指针。对于Josephus问题,我们可以...

    Visual C++ 编写的Josephus问题.rar

    《Visual C++ 实现Josephus问题详解》 Josephus问题,源自古罗马历史学家Flavius Josephus在《犹太战争》中描述的一个历史事件,后来被转化为一个经典的理论问题。该问题通常表述为:一群人站成一个圈,每隔一定的...

    Josephus问题.pdf

    Josephus问题,又称为“约瑟夫环”或“丢手绢问题”,是一个经典的计算机科学和数学问题。这个问题的起源有一个古老的故事背景,但与解决问题的具体算法设计并无直接关联。以下是Josephus问题的详细描述和一种可能的...

    josephus问题.docx

    ### Josephus问题详解 #### 一、问题背景与描述 Josephus问题是一个历史悠久且非常经典的数学和计算机科学问题。该问题通常被描述为一个约瑟夫斯环形问题:有n个人(编号从1到n)围坐成一个圈,从第一个人开始报数...

    Josephus问题的顺序表实现.rar_Josephus

    《Josephus问题的顺序表实现》 Josephus问题是一个经典的理论问题,源于古罗马时期的战争策略,后来被数学家Josephus Flavius提出并成为数学和计算机科学领域的一个经典问题。该问题通常描述为:在圆形排列的人群中...

    c++实现Josephus问题

    设有n个人围坐一圈并由1到n编号,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新1到n报数,数到m的人又出列,如此反复地报数和出列,直到最后一个人出列为止,设计确定这n个人出列序列的程序

    Josephus问题向量实现

    《Josephus问题与向量实现解析》 Josephus问题,源于古罗马时期的历史事件,是一个经典的理论问题,常被用于探讨计算机科学中的算法设计。在该问题中,人们站成一个圈,按照一定的顺序每固定人数后淘汰一人,直至只...

    Josephus问题实现VC

    《Josephus问题的C语言实现:链表与向量法》 Josephus问题,源于古罗马历史上的一个典故,是一个经典的理论计算问题,通常被用于探讨和研究循环链表、数组以及递归算法等数据结构与算法概念。在本实验报告中,我们...

    josephus问题.rar

    Josephus问题,也称为“约瑟夫环”或“丢手绢问题”,是一个在计算机科学和数学中经典的问题。以下是对Josephus问题的清晰回答: 问题背景 Josephus问题的起源可以追溯到罗马人占领乔塔帕特后,39个犹太人与...

Global site tag (gtag.js) - Google Analytics