班級活動中,乙個班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 第一.我們先演繹一下,我...