约瑟夫问题的循环链表实现
生活随笔
收集整理的這篇文章主要介紹了
约瑟夫问题的循环链表实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。? 17世紀的法國數學家加斯帕在《數目的游戲問題》中講了這樣一個故事:15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其余的人才能幸免于難,于是想了一個辦法:30個人圍成一圓圈,從第一個人開始依次報數,每數到第九個人就將他扔入大海,如此循環進行直到僅余15個人為止。問怎樣排法,才能使每次投入大海的都是非教徒。 一般形式:N個人圍成一圈,從第k個開始報數,第M個將被殺掉,最后剩下一個,其余人都將被殺掉。例如N=6,M=5,被殺掉的順序是:5,4,6,2,3,1。 輸出被殺人的編號順序 1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 using namespace std;
5 struct node{
6 int x;
7 node* next;
8 };
9 node* creatlist(int n)
10 {
11 int i;
12 node *temp=NULL,*head=NULL,*tail=NULL;
13 for(i=0;i<n;i++)
14 {
15 if(head==NULL)
16 {
17 head=(node*)malloc(sizeof(node));
18 head->x=i+1;
19 tail=head;
20 }
21 else
22 {
23 temp=(node*)malloc(sizeof(node));
24 temp->x=i+1;
25 //temp->next=NULL;
26 tail->next=temp;
27 tail=temp;
28 }
29 }
30 tail->next=head;
31 return head;
32 }
33 void output(node* head)
34 {
35 node* p=head;
36 while(p!=NULL)
37 {
38 cout<<p->x<<' ';
39 p=p->next;
40 }
41 }
42 node* find(int k,node* head)
43 {
44 int i=0;
45 node *p=head;
46 for(i=0;i<k-1;i++)
47 p=p->next;
48 return p;
49 }
50 void out(node* p,int m)
51 {
52 int i=0;
53 node *pre=NULL;
54 while(p->next!=p)
55 {
56 for(i=0;i<m-1;i++)
57 {
58 pre=p;
59 p=p->next;
60 }
61 cout<<p->x<<' ';
62 pre->next=p->next;
63 p=p->next;
64 }
65 cout<<p->x;
66 }
67 int main()
68 {
69 int n,k,m;
70 node *head,*p;
71 cin>>n>>k>>m;
72 head=creatlist(n);
73 //output(head);
74 p=find(k,head);
75 cout<<p->x<<endl;
76 out(p,m);
77 }
?
轉載于:https://www.cnblogs.com/a1225234/p/4615965.html
總結
以上是生活随笔為你收集整理的约瑟夫问题的循环链表实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: overfitting
- 下一篇: 【SSH三个框架】Hibernate第八