單向迴圈鍊錶 約瑟夫問題

2021-06-22 05:02:38 字數 1147 閱讀 8492

班級活動中,乙個班n人圍成一圈玩遊戲時,從某乙個人開始數數,當數到m的那個人必須表演乙個節目,同時這個人退出遊戲。如何安排位置,能使自己避免表演節目呢? 此類問題與約瑟夫問題是同一類問題。

有名的約瑟夫問題:n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n=5,m=2,被殺掉的人的序號為2,4,1,5;最後只留下3。

此類問題都可以用單迴圈鍊錶給以解決。結點包含當前的序號和指向下一序號(或者說結點)的指標。建好整個單迴圈鍊錶後,從頭結點開始遍歷,同時開始計數(count=1開始),當count=m-1時,刪除第m個結點(即序號為m的結點將會受到懲罰)。迴圈最終只餘下乙個結點。

本文參考部落格進一步給出詳細的理解。 

第一步,建立單迴圈鍊錶

typedef struct node  

node,*pnode;

pnode list_init(int n)

return head; }

pnode insertnode(int n)

本文以n=5為例,上述**實現如下單迴圈鍊錶

第二步,從list(文中為編號為1的結點)開始,開始計數。當count=m-1時,刪除第m個結點(即序號為m的結點將會受到懲罰)。**如下

pnode list_begin(pnode list,int m)  

list = list->next;

} return list;

}

void list_show(pnode list)

dowhile(list!= p);

printf("\n");

}

當n=5,m=3時,m-1=2

當第一次count=2時,此時list指向序號為2的結點,刪除序號為3的結點(到序號為3的結點時,計數值count必為3),刪掉後遍歷鍊錶,輸出值為

2,4,5,1

而後情況類似。

約瑟夫問題(單向迴圈鍊錶)

約瑟夫問題有時也稱為約瑟夫斯置換或者猴子選大王問題,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 假設有nums個節點,從第startno個開始報數,輸出第countnum個節點,並將第countnum個節點從nums個節點中刪除,請問輸出...

單向迴圈鍊錶 約瑟夫環

寫個約瑟夫環,檢驗一下自己的學習狀況.include define elemtype int typedef struct lnodesqlist void initlist sqlist l,elemtype n void round sqlist l,int m,int n int main v...

golang解決約瑟夫問題,單向迴圈鍊錶實現

這是經典的約瑟夫環,並且期望剩餘的人數是2,我們這裡也做了乙個通配,可以輸入期望剩餘的人數,比如期望剩餘1個,那麼31這個位子可以存活。當然解決關鍵就是得用到單向迴圈鍊錶,語言自然選擇的是golang,當然這算是第一版本以實現功能為主,還有很多待改進的地方。let s go 第一.我們先演繹一下,我...