约瑟夫

约瑟夫循环 升级版

一世执手 提交于 2020-02-11 12:19:41
输入n,代表总人数 第二行输入每个人的编号,按照编号进行循环,即用编号代替了原先的定值。 最后输出幸存者的编号。 # include <stdio.h> int main ( ) { int i , j , k , m , n ; i = j = k = m = n = 0 ; int peo , where ; scanf ( "%d" , & peo ) ; int all [ peo ] ; for ( i = 0 ; i < peo ; i ++ ) { scanf ( "%d" , & all [ i ] ) ; } where = 0 ; while ( peo != 1 ) { where = ( where + all [ where ] ) % peo ; if ( where == peo - 1 ) { peo -- ; continue ; } else { while ( where != peo - 1 ) { all [ where ] = all [ where + 1 ] ; where ++ ; } peo -- ; continue ; } } printf ( "%d\n" , all [ 0 ] ) ; } 来源: CSDN 作者: bupt_sanqing 链接: https://blog.csdn.net/bupt_sanqing

P1996 约瑟夫问题(C++_模拟)

坚强是说给别人听的谎言 提交于 2020-02-01 14:21:10
题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入格式 n m 输出格式 出圈的编号 输入输出样例 输入 #1 10 3 输出 #1 3 6 9 2 7 1 8 5 10 4 说明/提示 m,n≤100 思路 把走过的点标记一遍,只有未标记过的点才算数,如果所有点都标记过了,那么程序运行结束。(dbq, 让这种水题拉低了我的博客整体题解难度,不过也体验了一把神犇切题的快感~) 源码 # include <bits/stdc++.h> using namespace std ; int n , m , sum = 0 ; int a [ 100 ] , b [ 100 ] ; bool judge ( ) { for ( int i = 0 ; i < n ; i ++ ) if ( b [ i ] == 0 ) return 0 ; return 1 ; } int main ( ) { cin >> n >> m ; memset ( b , 0 , sizeof ( b ) ) ; for ( int i = 0 ; ! judge ( ) ; i ++ ) { if ( i == n ) i = 0

约瑟夫

天大地大妈咪最大 提交于 2020-01-10 19:00:47
在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 N=41,M=3 >>> a array([[0, 1, 2], [8, 4, 5], [6, 7, 8]]) >>> print(np.where(a==np.max(a))) #include <iostream> using namespace std; int main(void) { int n, m,i, s=0; scanf("%d %d",&n,&m); for(i=2;i<=n;i++) { s=(s+m)%i; } printf("The winner is %d\n", s + 1); } 来源: CSDN

约瑟夫死亡问题

冷暖自知 提交于 2019-12-08 13:12:48
Josephus problem 简介: 据说著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 实现: 先定义一个循环链表的结构体 struct mystructure { int id = 0;//添加id的属性 int live = 1;//生命值为1代表生存 mystructure* next = nullptr; }; 定义头尾指针并生成一个指定格数为p的循环链表 mystructure* head = new mystructure; mystructure* tail = new mystructure; head-

约瑟夫游戏

廉价感情. 提交于 2019-12-03 17:48:16
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; long long read(){ long long a=0,b=1; char ch=getchar(); while(ch<'0'||ch>'9'){ ch=getchar(); } if(ch=='-'){ b=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ a=a*10+ch-'0'; ch=getchar(); } return a*b; } int main(){ freopen("joseph.in","r",stdin); freopen("joseph.out","w",stdout); long long n,m; n=read(),m=read(); long long i; for(i=1;i<=(n-1)/m;i*=m); printf("%lld",((n-i)/(m-1)*m-1)%n+1); return 0; }    不开long long就...... 来源: https://www.cnblogs.com/xiongchongwen/p/11805431.html

Java使用队列解决约瑟夫问题

送分小仙女□ 提交于 2019-12-03 05:06:00
约瑟夫问题: 传说在公园1世纪的犹太战争中,犹太约瑟夫是公元一世纪著名的历史学家。在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人俘虏,于是决定了一个流传千古的自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从这个约定,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第_个和第_个位置,于是逃过了这场死亡游戏,你知道安排在了第几个嘛? 队列实现: package org.codewy.algorithm.josephusproblem; import java.util.LinkedList; import java.util.Queue; public class JosephusProblem { public static void main(String[] args) { Queue<Integer> persons = new LinkedList(); for (int i = 1; i < 42; i++) { persons.add(i); } int count = 0; while (persons.size() > 2) { count++; Integer person = persons

约瑟夫算法

两盒软妹~` 提交于 2019-11-28 19:31:30
python实现约瑟夫算法 什么是约瑟夫环? 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号 1 , 2 , 3 . . . n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从 1 开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从 0 ~ n - 1 ,最后 [ 1 ] 结果 + 1 即为原问题的解。 原理: 1、一群人围在一起坐成环状(就相当于圆桌会议) 2、从某个编号开始报数 3、数到某个数的时候,此人出列,下一个人重新报数 4、一直循环,直到所有人出列 ,约瑟夫环结束 图例 实例: def ysf ( n , k , m , f ) : """ 约瑟夫环算法 :param n: 添加到环中n个数 :param k: 从环中第k个值开始数数 :param m: 数到m就把数踢出这个环 :param f: 最后剩余的个数 :return: None """ #产生一个约瑟夫环 lst = [ i for i in range ( 1 , n + 1 ) ] t = k - 1 #控制循环,踢出指定数量的元素 for i in range ( n - f ) : #挑出下一个被踢出的元素 t = ( t + m - 1 ) % len ( lst ) #pop踢出