資料結構基礎 雙向約瑟夫問題

2021-08-09 14:43:54 字數 3170 閱讀 8632

成績

15開啟時間

2023年09月27日 星期三 00:05

折扣0.8

折扣時間

2023年10月20日 星期五 23:55

允許遲交

否關閉時間

2023年01月8日 星期一 23:55

約瑟夫問題是乙個經典的問題,我們不妨將這個經典問題進行擴充套件,變成乙個雙向的約瑟夫問題。

已知 n 個人(不妨分別以編號 1,2,3,...,n 代表 )圍坐在一張圓桌周圍,首先從編號為 k 的人從 1 開始順時針報數,1, 2, 3, ...,記下順時針數到 m 的那個人,同時從編號為 k 的人開始逆時針報數,1, 2, 3, ...,數到 m 後,兩個人同時出列。然後從出列的下乙個人又從 1 開始繼續進行雙向報數,數到 m 的那兩個人同時出列,...;。依此重複下去,直到圓桌周圍的人全部出列。直到圓桌周圍只剩乙個人為止。

如果雙向報數報到 m 時落在同乙個人身上,那本次出列的只有乙個人。

例如:5,1,2。則總共5個人,從1開始順時針報數,數到2,定位編號2;同時從1開始報數數到2,定位編號5;2和5同時出列。然後繼續開始報數,順時針報數3,4,定位到4;逆時針報數4,3,定位3;4和3同時出列。最後剩餘的為編號1。輸出為:2-5,4-3,1,。

如果輸入:6,2,3。則輸出:4-6,2,1-3,5,。其中第2次只輸出乙個2,表示第二次雙向報數時,恰好都落在編號2上,所以只有乙個編號出列。

n,k,m

按照出列的順序依次輸出編號。同時出列編號中間用減號"-」連線。

a)輸入:n、k、m任乙個為0

輸出:n,m,k must bigger than 0.

b)輸入:k>n

輸出:k should not bigger than n.

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

1,0,0↵

以文字方式顯示

n,m,k must bigger than 0.↵ 1秒

64m0

測試用例 2

以文字方式顯示

1,2,1↵

以文字方式顯示

k should not bigger than n.↵ 1秒

64m0

測試用例 3

以文字方式顯示

5,1,2↵

以文字方式顯示

2-5,4-3,1,↵ 1秒

64m0

測試用例 4

以文字方式顯示

6,2,3↵

以文字方式顯示

4-6,2,1-3,5,↵ 1秒

64m0

0)定義乙個結構體,和約瑟夫問題一致,然後多了乙個front構建乙個雙向的迴圈鍊錶(因為約瑟夫問題裡的鍊錶建立可能寫的不太規範。。所以在建立的時候還是先建立單向的迴圈鍊錶然後再在後面把這個迴圈鍊錶給反向再連了一次)

1)建立雙向迴圈鍊錶,先建立單項迴圈鍊錶然後再建立雙向的迴圈鍊錶

2)然後找到第k個

3)【主要部分】從第k個人開始,雙向檢索,如果是不一樣的人,都輸出,如果是乙個人,只輸出他。這裡就會出現幾個問題。。。就可以分成大概幾種情況①、②輸出兩個人,輸出完是(否)結束,③④輸出乙個人,輸出完是(否)結束。

要注意輸出完要刪除節點,重置timer,還有有就是結束情況。。(我就是沒有注意最後輸出兩個後結束的情況。。然後re了。。)

然後開始想為什麼re:

1、陣列越界

2、記憶體未分配成功,卻使用

3、記憶體分配成功,但未初始化

4、使用已經釋放了的記憶體

然後發現。。最後輸出完沒有結束還在跑。。那肯定re啊喂(#`o′) ,然後就是設定了乙個sumcounter,輸出幾個加上幾個。。輸完就結束~然後就ok了~~大概如此。。程式寫的還是略亂,重複片段有一些。。但是寫出來了~記錄一下~hhh

#include#includeint n,m,k;

struct node;

typedef struct node *ptrtonode;

typedef ptrtonode list,position;

typedef struct node

;int main()

if(k>n)

int initialrank=n;

head->element=1;

head->next=head;

head->front=head;

while(initialrank>=2)

//建立初始的順時針向圈

position p=head,q;

while(p->next!=head)

head->front=p;//建立逆時針向圈

list p=head;

while(1)

else

}//找到先排號k的那乙個數字

list q=p;

int times=1;

int deletesum=0;

while(1)

else

else printf(",");

p->front->next=p->next;

p->next->front=p->front;

q->front->next=q->next;

q->next->front=q->front;

position te***=p->front->next;

position temp4=q->next->front;

free(p);

p=te***;

q=temp4;

times=1;

}else

p->front->next=p->next;

p->next->front=p->front;

q->front->next=q->next;

q->next->front=q->front;

position temp1=p->front->next;

position temp2=q->next->front;

free(q);

free(p);

p=temp1;

q=temp2;

times=1;

continue;

}} }

}

資料結構 約瑟夫問題

約瑟夫問題 上課結束,大家聽說第一周沒有程式設計題目,立刻就被鄙視了,為了糾正這個錯誤,咱們本週就來做點簡單題目。本題要求用迴圈鍊錶實現 約瑟夫問題是乙個經典的問題。已知n個人 不妨分別以編號1,2,3,n 代表 圍坐在一張圓桌周圍,從編號為 k 的人開始,從1開始順時針報數1,2,3,順時針數到m...

資料結構 約瑟夫問題

約瑟夫問題是乙個經典的問題。已知n個人 不妨分別以編號1,2,3,n 代表 圍坐在一張圓桌周圍,從編號為k 的人開始,從1開始順時針報數1,2,3,順時針數到m 的那個人,出列並輸出。然後從出列的下乙個人開始,從1開始繼續順時針報數,數到m的那個人,出列並輸出,依此重複下去,直到圓桌周圍的人全部出列...

資料結構 約瑟夫環問題

實驗一線性表的應用 實驗目的和要求 通過實驗進一步理解線性表的邏輯結構和儲存結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鍊錶的實際應用。主要內容 題目1 josephus環問題 問題描述 約瑟夫 joseph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼...