雙向迴圈鍊錶 解決順逆時針約瑟夫環

2021-07-07 09:31:33 字數 2125 閱讀 3100

題目來自蘇州oj 資料結構第二題;

內容:

【問題描述】

有n個人圍坐在乙個圓桌周圍,把這n個人依次編號為1~n。從編號為1的人開始順時針報數,報到m1的人出列;然後逆時針方向報數,報到m2的人出列。問最後誰出列?(從1開始順時針數m1,第m1個人出局,然後逆時針數m2,第m2個人出局,以此類推)

【輸入】

輸入資料僅一行,包含三個用空格隔開的正整數n,m1和m2。

【輸出】

資料資料僅一行,包含乙個正整數k,即最後乙個人的序號。

【樣例】 輸入

10 5 7 輸出

6我錄入了書本上的雙向迴圈鍊錶的全部**,便於以後深入研究。(並且新增了幾個函式,便於解這道題)

dbllist.h

#includeusing namespace std;

templatestruct dblnode

dblnode(t value, dblnode*left = null, dblnode*right = null) :data(value), llink(left), rlink(right){}

};templateclass dbllist

int length() const;

bool isempty()

dblnode*search(const t&x);

dblnode*locate(int i, int d);

bool insert(int i, const t&x, int d);

bool remove(int i, t&x, int d);

dblnodeoutput(dbllist &l);

void jos(int n, int p, int q, int d);

//private:

dblnode*first, *nail;

};templatedbllist::dbllist(t uniqueval)

first->rlink = first->llink = first;

}templateint dbllist::length()const

return count;

}templatedblnode*dbllist::search(const t&x)

templatedblnode*dbllist::locate(int i, int d)

if (current != first) return current;

else return null;

}templatebool dbllist::insert(int i, const t&x, int d)

if (d == 0)

else

return true;

}templatebool dbllist::remove(int i, t &x, int d)

templatedblnodedbllist::output(dbllist &l)

return current;

}templatevoid dbllist::jos(int n, int x, int y, int d)

p->llink->rlink = p->rlink;//確定位置後,刪除結點p

p->rlink->llink = p->llink;

} else if (d % 2 != 0)

p->llink->rlink = p->rlink;//確定位置後,刪除結點p

p->rlink->llink = p->llink; }

if (d % 2 == 0) first = p->llink;//先順時針,後逆時針

else first = p->rlink;

delete p;

d++;

}

main.cpp

#include#include"dbllist.h"

int main()

list.jos(10, 4, 6, 0);

list.output(list);

system("pause");

return 0;

}

最後輸出 6;

迴圈鍊錶解決約瑟夫迴圈問題

最近開始複習資料結構,今天手寫了乙個約瑟夫迴圈問題。首尾相連的鍊錶 head last tail tail next head 建立迴圈鍊錶和建立普通鍊錶方法差不多,只需要首尾相連即可 已知 n 個人 以編號1,2,3,n分別表示 圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那...

迴圈鍊錶解決約瑟夫 問題

據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所...

迴圈鍊錶解決約瑟夫環問題

題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...