IOS 約瑟夫環遊戲的實現

追夢秋陽發表於2017-04-09

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
            }
        }
    }
    }


相關文章