约瑟夫环问题

Posted clclcl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫环问题相关的知识,希望对你有一定的参考价值。

题目:设有x个人坐成一个圈,序号为依次为1,2,3......x,选定一个数字n,从1号开始从1报数,每次报到数字n时那个人自杀剩下的人继续从1开始报数,直到所有人都出列,求所有人自杀的顺序。(惊恐万分)

输入:人数x,数字n

输出:a1 a2 a3..... ax

 

示例输入: 

5  2

输出:

2 4 1 5 3

 

Answer:

 1 #include "stdio.h"
 2 
 3 #include "stdlib.h"
 4 
 5 //输入总人数和报的数字,输出所有人的死亡顺序
 6 void diesorder(List*plist,int total,int number);//输出顺序
 7 void deletenode(Node*plist,int n);//删除链表中某一结点
 8 void creat_list(List *plist,int number);//创造链表
 9 
10 //利用循环链表
11 
12 int main(int argc, char const *argv[])
13 {
14     int total,number;
15     printf("请输入总人数
");
16     scanf("%d",&total);
17     printf("请输入所报的数
");
18     scanf("%d",&number);
19     printf("死亡顺序为:
");
20     
21     List josef;
22     diesorder(&josef,total,number);
23     
24     return 0;
25 }
26 
27 void creat_list(List *plist,int number)
28 {
29     
30     Node *p=(Node *)malloc(sizeof(Node));
31     p->value=number;
32     p->next=NULL;
33     
34     Node *last=plist->head;
35     if(last)
36     {
37         while(last->next)
38             last=last->next;//链接
39         last->next=p;
40     }
41     else
42         plist->head=p;
43 }
44 
45 void diesorder(List*plist,int total,int number){
46     for (int i=1; i<=total; i++) {
47         creat_list(plist, i);
48     }
49     
50     Node*p;
51     p=plist->head;
52     for (;p->next; p=p->next) {
53         ;
54     }//遍历到最后一个节点
55     p->next=plist->head;  //改造为循环链表
56     
57     Node*p2=plist->head;
58     for (int i=1; ;i++,p2=p2->next) {
59         if (i==number) {
60             i=0;printf("%i ",p2->value);deletenode(p2,total);total--;
61             }
62         if (total==0) {
63             break;
64         }
65         }
66 }
67 
68 void deletenode(Node*plist,int n){
69     Node*pre=plist;
70     for (int i=1;i<n; i++) {
71         pre=pre->next;
72     }
73     pre->next=plist->next;
74     Node*pp=plist;
75     plist=pre->next;
76     free(pp);
77     pp=NULL;
78     
79 }

 

以上是关于约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章

约瑟夫环问题

约瑟夫环问题

用单向循环链表实现约瑟夫环问题

约瑟夫环问题

约瑟夫环问题

java中约瑟夫环代码实现