约瑟夫环

线性表应用:约瑟夫问题(猴子选大王)(循环链表,数组,递归)

喜你入骨 提交于 2020-03-14 12:41:16
1 描述:一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。 2 如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王? 3 //用循环链表 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 typedef struct node 8 { 9 int data; 10 struct node *next; 11 }node; 12 13 node *create(int n) 14 { 15 node *head; 16 node *p = NULL; 17 head = (node *)malloc(sizeof(node)); 18 p = head; //p为指向当前结点的指针 19 node *s; 20 int i = 1; 21 22 if(n != 0) 23 { 24 while(i <= n) 25 { 26 s = (node *)malloc(sizeof(node)); //临时的结点 27 s->data = i++; //第一个结点的值为1 第二个结点的值为2 先给值i才++ 28 p->next = s; //头结点的指针域指向第一个结点 29 p =

(个人详细思路约瑟夫环问题)c++版有n个人围成一圈,顺序排号。从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。

岁酱吖の 提交于 2020-03-08 21:01:30
#include<iostream> using namespace std; int main(){ int a[100];//最多100人 int n;//人数; int count;//数数1~3 int * p;//指针指向a[] int out;//出去人数一开始是0 int i; cout<<"一共有多少人:"; cin>>n; count=0;//这是按123报数时的计数变量 out=0;//记录退出人数 p=a; //p指向数组a,p的地址是a[0] for(i=0;i<n;i++){ //从1到n给每个人编号 a[i]=i+1; //a[0]是第一个人但是最后要求出最后的人是第几个人,所以 } //第一个人给他序号1,依次给序号 while(out<n) //循环直到只剩下一个人没退出为止 { if(*(p+i)!=0) // (p[i]!=0)出去的人序号变为0,没有出去的人就开始报数 count++; //第一个人报数1 if(count==3) //如果报数是3,这个人序号牌就是0,表示他出去了 { *(p+i)=0; count=0; //下面继续从1开始报数 out++; //出去的人数加1 } i++; //计数变量+1,继续遍历 if(i==n-out-1) //总人数-出去人数=还有多少人,再-1是因为i从0开始数的 i=0; //一轮报完数

19 约瑟夫环2

久未见 提交于 2020-03-08 00:59:36
问题描述 : 明明是一名公安局的谈判专家,专门负责和绑匪谈判。有一次,明明接到一个特殊的任务,他赶到了案发现场,发现有k个绑匪绑架了k个人质,于是明明就开始和绑匪进行谈判。绑匪提出了一个非常特殊的要求,如果明明能够回答出这个问题,那绑匪将释放所有的人质;否则,绑匪就要撕票。 绑匪的问题是这样:绑匪把人质和自己围成一个圈,把人质从1开始编号,一直编到k,然后绑匪自己从k+1开始编号,一直编到2k。现在从编号1开始,每次从其中选出第m个人(隔m-1选出一个人)出列,然后绑匪要求明明选定这个m值,且m值要尽量的小,使得最先出列的k个人都是绑匪。 例如:有3个坏人和3个人质,他们排成一圈,其中编号1到3的为人质,编号4到6的为坏人,如下: 1、2、3、4、5、6; 明明要选定m=5时,能够满足绑匪的要求。因为: 第一轮,从1开始数,编号5出列,剩下的人为: 1、2、3、4、6; 第二轮,从6开始数,编号4出列,剩下的人为: 1、2、3、6; 第三轮,从6开始数,编号6出列,剩下的人为: 1、2、3; 这样所有的绑匪都先出列,明明可以成功地救出所有的人质。 如果明明能够找到这个m值,那么所有的人质都想获救,否则的话,后果不堪设想。明明意识到了问题的严重,这个问题对他来说十分地棘手。于是明明想到了你,你是一名程序设计专家,明明想让你用程序来解这个问题,救出所有的人质。 明明的问题可以归结为

【Python入门基础】约瑟夫环问题

自闭症网瘾萝莉.ら 提交于 2020-03-07 15:14:35
约瑟夫环问题 《幸运的基督徒》 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。 def main(): persons = [True] * 30 counter, index, number = 0, 0, 0 while counter < 15: if persons[index]: number += 1 if number == 9: persons[index] = False counter += 1 number = 0 index += 1 index %= 30 for person in persons: print('基' if person else '非', end='') if __name__ == '__main__': main() 结果 基基基基非非非非非基基非基基基非基非非基基非非非基非非基基非 来源: CSDN 作者: ZoomToday 链接: https://blog.csdn.net/qq_36477513/article

笔试题:约瑟夫环的问题

可紊 提交于 2020-03-03 15:41:25
约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载,加上风浪大作,危险万分。因此船长告诉乘客,只有将全船29个旅客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,数到第三个人,便将他投入大海中,如此,循环的进行,直到剩下一个游客为止。 问:哪些位置是将被扔下海的位置? int main(void) { int a[30] = {0}; int *p = a; int out_n = 0; int call_n = 0; while(1) //循环报数 { if(0 == *p) //如果健在 { //如果仅剩一人 if(29 == out_n) { break; } //报数 call_n++; //最大为3,到了三就从0开始 call_n %= 3; // if(0 == call_n) { *p = 1; out_n++; } } p++; if(p == a+30) { p = a; //循环转向下一个人 } } printf("最后剩余者的编号为:%d\n", p-a+1); return 0; } 来源: CSDN 作者: 酷酷的HK 链接: https://blog.csdn.net/qq_42483691/article/details/104629973

基于C++约瑟夫环问题实现

此生再无相见时 提交于 2020-03-03 13:39:32
程序设计思路:定义两个指针p1,p2,p1用于跟踪删除节点的前驱地址,p2用于跟踪要删除的节点地址,保证p1一直处于p2的左侧,根据输入的截止数字进行循环,同时也要处理好倒数第二个节点被删除时,程序应当如何安全结束并跳出循环。 来源: https://www.cnblogs.com/haochunlin/p/12401624.html

环形链表简介和约瑟夫环的实现

巧了我就是萌 提交于 2020-03-02 07:57:14
环形链表简介 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来。单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个结点的链域指向链表结点。 简单点说链表首位相连,组成环状数据结构。 如图所示: 约瑟夫环简介: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 假设现在约瑟夫环有5个人,从第1个开始报数,数到2的出列。 那么出圈的顺序为2—>4—>1—>5—>3 要实现约瑟夫环问题,得先构建一个环形链表,在分析出圈思路。 构建环形链表的思路如下: 1 创建第一个节点,并让头指针first指向该节点,形成自环。 2 我们每创建一个节点,就把该创建的节点加到环中,并把新节点的next指向first节点。 (first为头指针,curBoy为尾指针,boy表示一个节点对象) 代码如下: // 创建一个Boy类,表示一个节点 class Boy { private int no ; // 编号 private Boy next ; // 指向下一个节点,默认null public Boy ( int no ) { this . no = no ; }

C++:顺序表类实现约瑟夫问题_密码不同

◇◆丶佛笑我妖孽 提交于 2020-03-01 14:47:24
1 //.h 2 3 #pragma once 4 #include <iostream> 5 using namespace std; 6 #define MAXSIZE 100 7 8 template <class T> 9 class SeqList 10 { 11   T data[MAXSIZE]; 12   int length; 13 public: 14   SeqList(); 15   SeqList(T a[],int n); 16   ~SeqList(); 17   void Josephus2(int p[], int m0); 18   void PrintList(); 19 }; 20 21 22 template <class T> 23 SeqList<T>::SeqList() 24 { 25   length = 0; 26 } 27 28 template<class T> 29 SeqList<T>::SeqList(T a[], int n) 30 { 31   length = n; 32   for (int i = 0; i < length; i++) 33     data[i] = a[i]; 34 } 35 36 template <class T> 37 SeqList<T>::~SeqList() 38 { 39

简单的约瑟夫环算法

落爺英雄遲暮 提交于 2020-03-01 14:28:27
约瑟夫环问题起源于一个犹太故事。约瑟夫环问题的大意如下:   罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家制定了一个自杀方案,所有这41个人围成一个圆圈,由第一个人开始顺时针报数,每报数为3的人就立刻自杀,然后再由下一个人重新开始报数,仍然是每报数为3的人就立刻自杀......,直到所有的人都自杀身亡为止。   约瑟夫和他的朋友并不想自杀,于是约瑟夫想到了一个计策,他们两个同样参与到自杀方案中,但是最后却躲过了自杀。请问,他们是怎么做到的? package com.cn.datastruct; import java.util.Scanner; //简单的约瑟夫环求解 public class Josephus { static final int Num=41; //总人数 static final int KillMan=3; //自杀者报数 //约瑟夫环算法 static void josephus(int alive){ int []man = new int[Num]; int count=1; int i=0,pos=-1; while(count<=Num){ do{ pos=(pos+1)%Num; //环处理 if(man