使用循环链表解决约瑟夫环问题
生活随笔
收集整理的這篇文章主要介紹了
使用循环链表解决约瑟夫环问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.問題來源:
據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。
2.??皖}目
本題牛客鏈接環形鏈表的約瑟夫問題
輸入描述:
一行兩個整數n和m,n表示環狀鏈表的長度,m表示每次報數到m就自殺。
輸出描述:
輸出最后存活下來的人編號(編號從1開始到n)
示例1
輸入
5 2
輸出
3
使用循環鏈表AC代碼:
#include<iostream> using namespace std; typedef struct node {int data;struct node *next; }*Node; int main() {int n;int m;cin>>n;cin>>m;Node head=new node;head->data=1;Node p=head;Node q=head;while(--n){q=new node;q->data=p->data+1;q->next=NULL;p->next=q;p=q;} p->next=head;p=head; q=head;while(1){for(int i=1;i<m;i++){q=p;p=p->next;}if(q->next==q)break;q->next=p->next;delete p;q=q->next;p=q;}cout<<q->data; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的使用循环链表解决约瑟夫环问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级线性表——静态链表(最全静态链表解读
- 下一篇: 递归时间/空间复杂度的分析(斐波那契为例