IOS 約瑟夫環遊戲的實現
IOS 約瑟夫環遊戲的實現
約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
具體推導及原理解析,請參考百度百科詳見:約瑟夫環_百度百科
本文主要介紹,通過使用 Obj-C 和 Swift 實現這個演算法過程,參考程式碼如下:
Objective-c 實現程式碼:
/**
* 約瑟夫遊戲
* 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列
* @parameter n 遊戲人數
* @parameter k 開始報數
* @parameter m 結束報數
*/
-(void)playGame:(NSInteger)n andStart:(NSInteger)k withEnd:(NSInteger)m{
if(n <= 0 || n <= k){
NSLog(@"請輸入正確的引數");
return;
}
//生成一個 1到n 的陣列,即玩遊戲的人員編號陣列
NSMutableArray *muarr = [NSMutableArray array];
for (NSInteger p = 1; p <= n; p++) {
[muarr addObject:[NSString stringWithFormat:@"%ld",(long)p]];
}
NSInteger j = 1; //報數器
NSString *strOut = nil; //出局編號
NSInteger index = [muarr indexOfObject:[NSString stringWithFormat:@"%ld",(long)k]]; //索引
//一直報數直到全部出局,即陣列長度為0
while (muarr.count >= 1) {
//迴圈報號
for (NSInteger i = 1;i <= m; i++,j++,index++) {
//從頭開始報數
if (index > muarr.count - 1) index = 0;
strOut = [NSString stringWithFormat:@"%@",[muarr objectAtIndex:index]];
if (j == m) {
NSLog(@"出局編號:%@",strOut);
//移除出局編號
[muarr removeObject:strOut];
//最後一個人不用迴圈報數了,就是他自己
if (muarr.count <= 1) {
NSLog(@"出局編號:%@",[muarr lastObject]);
return;
}
//下一個人開始報數
index--;
i = 0; //重新開始迴圈
j = 0; //計數器清零(從1開始報數,上面會累加1)
}
}
}
Swift程式碼參考:
/**
* 約瑟夫遊戲
* 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列
* @parameter n 遊戲人數
* @parameter k 開始報數
* @parameter m 結束報數
*/
func playGame(n:Int, andStart k:Int, withEnd m:Int){
if n <= 0 || n <= k {
print("請輸入正確的引數")
return;
}
//生成一個 1到n 的陣列,即玩遊戲的人員編號陣列
var arrPeole = [Int]()
for p:Int in 1...n {
arrPeole.append(p)
}
var j = 1 //報數器
var outPeople:Int? //出局人
var index = arrPeole.index(where: {return $0 == k}) //索引
//一直報數直到全部出局,即陣列長度為0
while arrPeole.count > 0 {
//迴圈報號
for var i:Int in 1...m {
//從頭開始報數
if index! > arrPeole.count - 1 {
index = 0
}
outPeople = arrPeole[index!]
if j == m {
print("出局編號:\(outPeople!)")
//移除出局編號
arrPeole.remove(at: index!)
//最後一個人不用迴圈報數了,就是他自己
if arrPeole.count <= 1 {
print("出局編號:\(arrPeole.last!)");
return;
}
//下一個人開始報數
index = index! - 1;
i = 0; //重新開始迴圈
j = 0; //計數器清零(從1開始報數,上面會累加1)
}
i = i + 1
j = j + 1
index = index! + 1
}
}
}
}
相關文章
- 約瑟夫環遊戲遊戲
- 約瑟夫環(陣列實現)陣列
- 面試題—Java遞迴實現約瑟夫環面試題Java遞迴
- 用Python實現約瑟夫環演算法Python演算法
- 約瑟夫環問題——初步瞭解+陣列實現陣列
- 約瑟夫環(vector類解決)
- 約瑟夫環(Josephus)問題--報數遊戲(連結串列)遊戲
- 約瑟夫生者死者遊戲問題遊戲
- 約瑟夫環 佇列+連結串列佇列
- 約瑟夫(Josephus problem)環問題初探
- javascript中使用迴圈連結串列實現約瑟夫環問題JavaScript
- 連結串列面試題(八)---約瑟夫環面試題
- 陣列解決約瑟夫環問題陣列
- 約瑟夫環(超好的程式碼存檔)--19--約瑟夫環--LeetCode面試題62(圓圈最後剩下的數字)LeetCode面試題
- java環形連結串列約瑟夫環問題筆記Java筆記
- 迴圈連結串列(約瑟夫問題)--python實現Python
- 資料結構實驗一:順序表的建立與操作實現、順序表實現約瑟夫環問題資料結構
- 約瑟夫問題pascal程式
- 約瑟夫出圈演算法演算法
- C語言陣列實現約瑟夫環出圈問題 程式碼詳細註釋 簡單易懂C語言陣列
- P1996 約瑟夫問題996
- 牛客題霸NC132環形連結串列的約瑟夫問題Java題解Java
- js利用指標操作約瑟夫問題程式碼例項JS指標
- 物件導向程式設計 約瑟夫問題簡要分析物件程式設計
- 實戰資料結構(4)_迴圈單連結串列解決約瑟夫問題資料結構
- 【圖解經典演算法題】如何用一行程式碼解決約瑟夫環問題圖解演算法行程
- 3.2資料結構之指標和連結串列 1748:約瑟夫問題資料結構指標
- 洛谷題單指南-線性表-P1996 約瑟夫問題996
- [java]java實現哈夫曼編碼Java
- 【資料結構X.11】程式碼實現 哈夫曼樹的建立,建立,構造,實現哈夫曼編碼資料結構
- 樹和二叉樹的基本運算實現-哈夫曼樹/哈夫曼編碼二叉樹
- 《什麼是高爾夫?》:萬物皆可高爾夫的瘋狂遊戲遊戲
- 實驗九 類與物件(一) 程式片段程式設計題 5. 約瑟夫問題2020-12-12物件程式設計
- 哈夫曼編碼 —— Lisp 與 Python 實現LispPython
- 隱馬爾可夫模型(HMM)實現分詞隱馬爾可夫模型HMM分詞
- 約瑟夫問題,輸入總人數,自動產生大於0小於n的隨機數隨機
- (iOS)KVO 的實現原理iOS
- 資料結構-哈夫曼樹(python實現)資料結構Python