Josephus

利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来

代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 typedef int status;
 5
 6 typedef struct node
 7 {
 8     status data;
 9     struct node *next;
10 }LinkList;
11
12 LinkList *create(int n)
13 {
14     LinkList *head,*p1,*p2;
15     int i;
16
17     head=(LinkList *)malloc(sizeof(LinkList));
18     head->next=NULL;
19     p1=head;
20
21     for(i=1;i<=n;i++)
22     {
23         p2=(LinkList *)malloc(sizeof(LinkList));
24         p2->next=p1->next;
25         p1->next=p2;
26         p1=p2;
27
28         p1->data=i;
29
30     }
31     p1->next=head->next;
32
33     return head;
34 }
35
36 void Josephus(LinkList *L)
37 {
38     LinkList *p1,*temp;
39     p1=L;
40     int i;
41
42     while(p1!=p1->next)
43     {
44         for(i=1;i<3;i++)
45         {
46             p1=p1->next;
47         }
48
49         printf("%d->",p1->next->data);
50         temp=p1->next;
51         p1->next=temp->next;
52
53         free(temp);
54     }
55     printf("%d\n",p1->data);
56     printf("\n");
57 }
58
59 int main()
60 {
61     LinkList *head;
62     int n;
63
64     scanf("%d",&n);
65
66     head=create(n);
67     Josephus(head);
68
69     return 0;
70 }

时间: 2024-10-20 15:44:13

Josephus的相关文章

Josephus环问题

约瑟夫环问题 问题描述: Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热土豆继续进行游戏,直到圈子只剩下最后一个人.例如:M=0,N=5,则游戏人依次被清除,5号最后留下:如果M=1,N=5,那么被清除的人的顺序是2,4,1,5,最后剩下的是3号. 如下是两种解题方法: 建立一个N大小的数组,存储N个人是否还在圈子内(0为在圈子内,-1为已经离开圈子),依次循环遍历整个

Josephus排列

思考与分析: 对于m为常数,可以用循环链表,用head,tail标志头尾指针使其易于表示循环结构.循环输出后删除结点n次,每次外层循环时,内层都固定循环m次.所以运行时间为O(mn)=O(n). 对于m为非常数.可以用顺序统计树,用size属性记录每个结点在当前树中所在的位置.经过一个取余过程,每次都能正确找到并输出删除每个结点,在经过n次循环,每次循环都要找到一个结点输出并删除它,所以每次循环都要花费O(lgn)时间.总的运行时间是O(nlgn). 代码如下: m为常数时: #include

约瑟夫环问题(Josephus)

[问题描述] 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序.(约瑟夫环问题 Josephus) [解题思路] 构建一个循环链表,每个结点的编号为1,2,......,n.每次从当前位置向前移动m-1步,然后删除这个结点. [C程序代码] #include <stdio.h> #include <stdlib.h> typedef struct node { int num; struct node *next; }node; node *

THE JOSEPHUS PROBLEM

问题描述: 古代刑法中,josephus 被告知与其他人一起围成一个圈,每隔三个人杀掉一个,求在哪个位置可以求生. 我们的问题是将数字围成一个圈,每隔一个数字去掉一个数字,数字从1开始,求最后剩下的数字的位置. 解决方案 当我们的数字是偶数的时候,从1开始,那么我们去掉的数字将是 2 4 6 8 … 当我们开始第二轮去掉数字的时候,将原来位置上面的数字按顺序重新从 1 开始编号,假设新一轮的位置编号为 n ,那么恢复为原来的位置就为 2*n-1.假定 J(2n) 为 2n 个数字围成的圈最后剩下

C/C++02: Josephus问题

据说著名犹太历史学家Josephus有过以下的故事: 在罗马人占领乔塔帕特後,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止. 然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 用循环列表的数据结构是比较容易实

习题3.10 约瑟夫环 josephus问题

/* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode List; typedef PtrToNode position; struct Node{ PtrToNode Previous; PtrToNode Next; int Ele; }; /* 删除双向循环链表中的元素例程 */ Position Delete( Position p ) { Pos

【DataStructure】 Classical Question: Josephus Cycle

[Description] This problem is based upon a report by the historian Joseph ben Matthias (Josephus) on the outcome of a suicide pact that he had made between himself and 40 soldiers as they were besieged by superior Roman forces in 67 A.D. Josephus pro

Josephus问题的不同实现方法与总结

1 /************************************************************************/ 2 /* Josephus问题--数组实现 */ 3 /************************************************************************/ 4 #include <stdio.h> 5 #include <malloc.h> 6 7 int Josephus(int

Josephus环类问题,java实现

写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组成的圈,数到3的那个人出列,下个人继续从一开始 */ public class Josephus { public static void main(String[] args) { Scanner s = new Scanner(System.in); int n = Integer.parseI