約瑟夫(Josephus problem)環問題初探
問題描述:N個人依次圍成一個圈,從1~N編號,從1號開始報數,報到M的人自殺(最後一個人不用自殺),問自殺順序以及誰是勝利者
演算法:
兩種方法:一種是用計算機模擬遊戲的執行過程,一種是直接推演出數學規律。這裡只討論前一種
陣列模擬
用一維陣列來表示這N個人的集合,由於非動態陣列無法模擬現實中的集合將某一個元素清理出集合,所以可以用一個額外的狀態標識陣列來記錄某個人是否已經自殺;雖然動態陣列模擬的集合可以將元素清理出去,但時間複雜度為O(N),所以不考慮這種方法。
演算法描述
/*
1、初始化編號陣列,狀態陣列
2、repeat until 還剩下不止一個人{
定位編號,修改狀態;
}
*/
void Josephus( int M, int N )
{
//初始化陣列
int * Jose = (int*)malloc( sizeof( int ) * N );
bool * JoseTag = (bool*)malloc( sizeof( bool ) * N );
for( int i = 0; i < N; i++ ) {
Jose[i] = i + 1;
JoseTag[i] = true;
}
//模擬遊戲進行
int start = 0; //每次報數時開始的下標{start|start belong to 0:N-1}
int end; //結束報數時的下標
//int delta = 0; //報了多少個數
int count = N; //還剩多少個人
while( count != 1 ) { //還未決出勝負
end = start;
int delta = 0;
while( delta < M ) { //要經過M個活人
end = (end + 1) % N;
if( JoseTag[end] == true )
delta++;
}
JoseTag[end] = false;
start = (end + 1) % N;
while( JoseTag[start] == false ) //當前編號的人必須是活人
start = (start + 1) % N;
printf( "%d\t", Jose[end] );
count--;
}
printf( "\n%d is the victor!\n", Jose[start] );
free( Jose );
free( JoseTag );
}
單迴圈連結串列模擬
/*
話不多說:直接建立一個單迴圈連結串列,模擬刪除即可
*/
void Josephus( int M, int N )
{
List Head = (List)malloc( sizeof( Node ) );
List Rear = Head;
Head->next = NULL;
for( int i = 0; i < N; i++ ) {
List S = (List)malloc( sizeof( Node ) );
S->number = i + 1;
Rear->next = S;
Rear = S;
Rear->next = NULL;
}
Rear->next = Head->next;
free( Head );
List Start = Rear;
int count = N;
while( count != 1 ) {
for( int i = 0; i < M; ++i ) {
Start = Start->next;
}
List Temp = Start->next;
Start->next = Temp->next;
printf( "%d\t", Temp->number );
free( Temp );
count--;
}
printf( "\n%d is the victor!\n", Start->number );
free( Start );
}
相關文章
- 約瑟夫環(Josephus)問題--報數遊戲(連結串列)遊戲
- 陣列解決約瑟夫環問題陣列
- 約瑟夫問題pascal程式
- 約瑟夫環遊戲遊戲
- java環形連結串列約瑟夫環問題筆記Java筆記
- 約瑟夫環問題——初步瞭解+陣列實現陣列
- 連結串列面試題(八)---約瑟夫環面試題
- 面試題—Java遞迴實現約瑟夫環面試題Java遞迴
- P1996 約瑟夫問題996
- 約瑟夫環(vector類解決)
- 約瑟夫環(陣列實現)陣列
- javascript中使用迴圈連結串列實現約瑟夫環問題JavaScript
- 約瑟夫環 佇列+連結串列佇列
- IOS 約瑟夫環遊戲的實現iOS遊戲
- 牛客題霸NC132環形連結串列的約瑟夫問題Java題解Java
- 約瑟夫環(超好的程式碼存檔)--19--約瑟夫環--LeetCode面試題62(圓圈最後剩下的數字)LeetCode面試題
- 迴圈連結串列(約瑟夫問題)--python實現Python
- js利用指標操作約瑟夫問題程式碼例項JS指標
- 物件導向程式設計 約瑟夫問題簡要分析物件程式設計
- 用Python實現約瑟夫環演算法Python演算法
- 【圖解經典演算法題】如何用一行程式碼解決約瑟夫環問題圖解演算法行程
- 洛谷題單指南-線性表-P1996 約瑟夫問題996
- 約瑟夫出圈演算法演算法
- C語言陣列實現約瑟夫環出圈問題 程式碼詳細註釋 簡單易懂C語言陣列
- Josephus問題解決方法一
- Josephus問題解決方法二
- 3.2資料結構之指標和連結串列 1748:約瑟夫問題資料結構指標
- 實戰資料結構(4)_迴圈單連結串列解決約瑟夫問題資料結構
- 資料結構實驗一:順序表的建立與操作實現、順序表實現約瑟夫環問題資料結構
- Josephus問題解決方法五(遞迴)遞迴
- 1234: 華科版C語言程式設計教程(第二版)習題6.11(約瑟夫問題)C語言程式設計
- Josephus問題解決方法四(迴圈陣列)陣列
- 約瑟夫問題,輸入總人數,自動產生大於0小於n的隨機數隨機
- 實驗九 類與物件(一) 程式片段程式設計題 5. 約瑟夫問題2020-12-12物件程式設計
- JS資料結構第三篇---雙向連結串列和迴圈連結串列之約瑟夫問題JS資料結構
- electron初探問題總結
- 最大子陣列問題(Maximum subarray problem)陣列
- 人工智慧的人類問題(The human problem of AI)人工智慧AI