问题:
设n个人围坐在一圆桌周围,依次编号为1,2,...,n,从第s个人从1开始依次报数,数到m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出列,…,如此反复直到所有的人全部出列为止。对于任意给定的n,s和m,输出按出列次序得到的n个人员的序列。(数据结构问题,请分别用顺序表和链表解决此问题,并自编多组数据测试)
利用数组来解决这个问题主要是在一次报数的时候数组会越界,这时得接着前面编号,这样就相当玩组成一个环形纽带
下面是Actionscript 3.0里的代码:
package
{
import flash.display.Sprite;
public class Josephus extends Sprite
{
private var _initData:Array;
private static var COUNT:int = 2; //中间相隔几个数
private static var TOTALNUMBER:int = 9; //总共的人数,
private static var START_NUMBER:int = 3; //从第几号开始报数
public function Josephus()
{
_initData = new Array();
initData();
showJosephus();
}
private function showJosephus():void
{
var temp:int = START_NUMBER;
for(var i:int = 0 ;i<_initData.length-1;i++)
{
for(var j:int = 0 ; j<COUNT ; j++)
{
temp = temp%_initData.length;
temp++;
}
temp = temp - 1;
trace(_initData[temp]+"\n");
_initData.splice(temp , 1);
i--;
}
trace("最后剩下的人的编号是:"+_initData[0]);
}
private function initData():void
{
for(var i:int = 1;i<=TOTALNUMBER;i++)
{
_initData.push(i);
}
}
}
}