約瑟夫問題有時也稱為約瑟夫斯置換或者猴子選大王問題,是乙個出現在電腦科學和數學中的問題。
在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱"丟手絹問題"。
假設有nums個節點,從第startno個開始報數,輸出第countnum個節點,並將第countnum個節點從nums個節點中刪除,請問輸出節點的順序。
/**
* 建立乙個node類
*/class
node
public
intgetno()
public
void
setno
(int no)
public node getnext()
public
void
setnext
(node next)
}
/*
* 建立乙個環形的單向鍊錶
*/class
josephutil
node curnode = null;
// 輔助指標,幫助構建環形鍊錶
// 使用for來建立我們的環形鍊錶
for(
int i =
1; i <= nums; i++
)else}}
/* * 遍歷當前的環形鍊錶
*/public
void
shownode()
// first始終指向第乙個節點,需要使用乙個輔助指標完成遍歷
node curnode = first;
while
(true
) curnode = curnode.
getnext()
;}}/**
* 根據輸入的內容,計算出輸出的順序
* * @param startno 表示從第幾個節點開始數
* @param countnum 表示第幾個開始輸出
* @param nums 表示在環形鍊錶中有多少個節點
*/public
void
josephprint
(int startno,
int countnum)
// 輸出節點前,先讓first移動k-2次
for(
int j =
0; j <
(startno + nums -2)
% nums; j++
)// 建立輔助指標,指向first節點的後面乙個節點
node helper = first;
first = helper.
getnext()
;// 當輸出節點時,讓first和helper指標同時移動m-1次, 然後輸出
// 迴圈結束後,環形鍊錶中只有乙個節點
while
(true
)// 讓first和helper指標同時移動countnum-1次
for(
int j =
0; j < countnum -
1; j++
)// first指向的節點就是要輸出的節點
system.out.
printf
("節點%d輸出\n"
, first.
getno()
);// 將first指向的節點從環形鍊錶中刪除
first = first.
getnext()
; helper.
setnext
(first);}
system.out.
printf
("最後乙個節點編號%d \n"
, first.
getno()
);}}
/**
* 測試
*/public
class
joseph
}
單向迴圈鍊錶 約瑟夫問題
班級活動中,乙個班n人圍成一圈玩遊戲時,從某乙個人開始數數,當數到m的那個人必須表演乙個節目,同時這個人退出遊戲。如何安排位置,能使自己避免表演節目呢?此類問題與約瑟夫問題是同一類問題。有名的約瑟夫問題 n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n 5,m...
單向迴圈鍊錶 約瑟夫環
寫個約瑟夫環,檢驗一下自己的學習狀況.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 第一.我們先演繹一下,我...