您的位置:首页 > 移动开发 > IOS开发

IOS 约瑟夫环游戏的实现

2017-04-09 20:34 281 查看

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
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐