约瑟夫环

c实现数据结构中约瑟夫问题

本秂侑毒 提交于 2019-12-25 13:02:13
//约瑟夫问题,已知n个人,围坐在一个圆桌周围,编号为k的人从1开始报数,数到m的那个人出列,他的下一个人从1开始继续报数,疏导m的那个人出列,直到圆桌周围人全部出列 #include <stdio.h> #include <stdlib.h> #define MaxSize 100 #define ElementType int typedef struct node{ ElementType data; struct node *link; }LNode,*LinkList; void JOSEPHU(int n,int k,int m); int main(){ int n,k,m; printf("%\ninput n,k,m"); //输入链结点总数n,报数的起始位置k和报数m scanf("%d%d%d",&n,&k,&m); JOSEPHU(n,k,m); } //约瑟夫函数 void JOSEPHU(int n,int k,int m){ //建立一个无头结点的非循环链表 LinkList p,r,list; list = NULL;//创建一个空链表 ElementType a; for(int i=1;i<=n;i++){ printf("请输入第%d个数据",i); scanf("%d",&a); p = (LinkList) malloc(sizeof

约瑟夫问题(最简)

若如初见. 提交于 2019-12-22 11:08:12
1.问题描述 约瑟夫环问题的基本描述如下:已知 n 个人(以编号1,2,3... n 分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。 #include<iostream> using namespace std; int main() { int n,m,k,ans=0; cin>>n>>k>>m; for(int i = 2; i <= n; i++)ans = (ans + m) % i; cout<<(ans+k)%n<<endl; } 来源: CSDN 作者: 咖喱东东 链接: https://blog.csdn.net/qq_39410381/article/details/103650806

7-5 约瑟夫环 (25分)

耗尽温柔 提交于 2019-12-20 14:11:24
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。 输入格式: 输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。 输出格式: 按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。 输入样例: 在这里给出一组输入。例如: 7 3 输出样例: 3 6 2 7 5 1 4 代码:递归 #include<stdio.h> #include<stdlib.h> int ysf(int n,int m,int i) { if(i==1) return (n+m-1)%n; else return (ysf(n-1,m,i-1)+m)%n; } int main() { int n,m; int i; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { printf("%d",ysf(n,m,i)+1); if(i!=n) printf(" "); } return 0; } 来源: CSDN 作者: 半零落 链接: https://blog.csdn.net/qq_43634412/article/details/103629552

约瑟夫问题(单向循环对列)

旧时模样 提交于 2019-12-18 03:57:42
题目描述: 题目解析: 该题是是基于单向循环队列实现的,其实简单点来说就是隔两个结点删一个结点,直至剩下两个结点,然后把两个结点中存储的数据输出。 解题步骤: 1.定义结点内部类,用于描述结点 2.创建关于创建链表的构造函数,通过for循环把结点位置一确定,每个结点的数据域中存储该结点的位置 3.编写函数删除指定位置的元素,将最终剩余的两个节点的位置一同放入一个线性表中,返回该线性表。如下图所示删除: 完整代码: package Ds02 . 动态链表 ; import DS01 . 动态数组 . ArrayList ; import DS01 . 动态数组 . List ; //约瑟夫环 真实头结点 循环一类的都是基于循环链表 public class JosephusLoop { private Node head ; private Node rear ; private int size ; public JosephusLoop ( int count ) { head = new Node ( 1 , null ) ; rear = head ; rear . next = head ; for ( int i = 0 ; i <= count ; i ++ ) { rear . next = new Node ( i , rear . next ) ; //尾插法

数据结构,约瑟夫环非链表解...

走远了吗. 提交于 2019-12-07 16:14:09
两个月前,我还没学习链表的时候看到了约瑟夫环的问题,试着用面向过程的思想把它实现了 今天去一个软件公司面试实习生的时候又看见了这题.... 我告诉面试官说我电脑上有自己实现的代码.可他非要我写在纸上. 然后我就做吧,结果面试的时候做题思路又完全变了.... 果然是代码写在机器上和写在纸上就完全不同了... 还是感觉自己基础太薄弱了... int main(int argc, const char * argv[]) { int child[500]; for (int i=0; i<500; i++) { child[i]=1; } int sum = 500; int position = 0; int lastPosition = 0; int number = 0; while (sum > 1) { if (child[position%500]>0) { number++; if (number == 3 ) { child[position%500] = 0; sum--; number = 0; } else{ lastPosition = position%500; } } position++; } printf("%d\n",lastPosition); return 0; } 来源: CSDN 作者: 汪苏哲 链接: https://blog.csdn.net

#2019120700020 约瑟夫问题七问

冷暖自知 提交于 2019-12-07 08:09:26
1.基本约瑟夫问题 题目描述 \(n\) 个人( \(n\le 100\) )围成一圈,从第一个人开始报数,数到 \(m\) 的人出列,再由下一个人重新从 \(1\) 开始报数,数到 \(m\) 的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入格式 \(n m\) 输出格式 出圈的编号 样例输入 10 3 样例输出 3 6 9 2 7 1 8 5 10 4 说明 \(m, n \le 100\) 2 题意描述 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入 \(n,k,m\) 输出 按顺序输出出圈人的编号 样例输入 9 1 5 样例输出 5 1 7 4 3 6 9 2 8 3 约瑟夫问题是个有名的问题: \(N\) 个人围成一圈,从第一个开始报数,第 \(M\) 个将被杀掉,最后剩下一个,其余人都将被杀掉。例如 \(N=6\) , \(M=5\) ,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。 假定在圈子里前 \(K\) 个为好人,后 \(K\) 个为坏人,你的任务是确定这样的最小 \(M\) ,使得所有的坏人在第一个好人之前被杀掉。 4 n个人排成一圈。从某个人开始

约瑟夫环问题

对着背影说爱祢 提交于 2019-12-06 22:50:28
7-3 约瑟夫环问题-hebust 约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c...分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入格式: 固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表,元素直接使用英文逗号 , 分开 输出格式: 一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】 输入样例: 在这里给出一组输入。例如: 3 a,b,c,d,e,f,g 输出样例: 在这里给出相应的输出。例如: c,f,b,g,e,a,d 实验代码 /*这题写了3个多小时,太难了。主要是着逗号有点烦,后来我就想直接把将元素存入另一个数组中,去掉逗号。 这样就好办多了,然后就遍历,判断,求余等。 #include<stdio.h> #define SIZE 100 int main() { int n; char str1[SIZE] = { 0 }; //输入元素 char str[SIZE] = { 0 }; //去逗号,存元素 int index = 0; //从第一个元素遍历 int step = 1; //第一个元素也算一步 int count = 0; //出列元素个数 char outs[SIZE]

约瑟夫环

穿精又带淫゛_ 提交于 2019-12-05 18:11:45
7-9 约瑟夫环 N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。 输入格式: 输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。 输出格式: 按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。 输入样例: 在这里给出一组输入。例如: 7 3 输出样例: 3 6 2 7 5 1 4 要输出每次删的人,只能使用这个模拟 #include<iostream> #include<cstdio> using namespace std; int main() { int n,m,t=0,s=0,die=0; bool a[3010],vo=true; cin>>n>>m; for (int i=1;i<=n;i++) a[i]=0; do { t++; if (t>n) t=1; if (a[t]==0) s++; if (s==m) { s=0; a[t]=1; die++; if (vo==true) { cout<<t; vo=false; } else cout<<' '<<t; } }while (die<n); return 0; } std约瑟夫环递归算法,不能输出每个删的人

约瑟夫环

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-04 09:25:51
用数组表示 1 #include<iostream> 2 3 using namespace std; 4 5 int main(){ 6 int a[30]; 7 bool visited[30]; 8 for(int i=0; i<30; i++){ 9 cout<<i+1<<" "; 10 a[i] = i; 11 visited[i] = false; 12 } 13 cout<<endl; 14 15 // 每个人数的数 16 int step = 0; 17 // 用来执行大循环 18 int cir = 0; 19 // 计算出局的人数 20 int total = 0; 21 22 while(total < 30){ 23 if(visited[cir] == false){ 24 step = (step + 1)%7; 25 if(step == 0){ 26 visited[cir] = true; 27 total++; 28 cout<<cir+1<<" "; 29 } 30 } 31 cir = (cir+1)%30; 32 33 } 34 } View Code 来源: https://www.cnblogs.com/zhishoumuguinian/p/11853055.html

基本约瑟夫环问题详解

北城余情 提交于 2019-12-03 14:11:35
本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 博客 : 传送门 首先让我们来看一下这一段: n-2 ---> (k1+n-2)%n1(n1为当前序列的总人数,因为是循环的序列,k1+n-1可能大于总人数) 至关重要,比如:我们已经知道当前的最后一个出列的位置为f ,设下一次最后一个出列的位置为ans 则 ans=(f+m)%n; 相当于是在f后往后再报m个数即可。 递推公式: 这样的话,我们就得到了递推公式, 由于编号是从0开始的 ,那么我们可以令 f[1] = 0; //当一个人的时候,出队人员编号为0 f[n] = (f[n-1] + m)%n //m表示每次数到该数的人出列,n表示当前序列的总人数   来源: https://www.cnblogs.com/nlyzl/p/11798488.html