題目來自蘇州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報數,如此下去,直到所有人...