wss1051 发表于 2017-4-6 11:36:55

PHP实现 约瑟夫报数问题

  有10个人报数,从1,2,3开始报,但有人喊道3时,退出。然后从退出的后面一个人开始重新报数,数到3的人又退出,直到剩下最后一个人。

    $inCir = array();
// 如果有10个人, 每个人都在圆圈内
for ($i=1; $i<=10; $i++) {
$inCir[$i] = 1;
}
$countPeople = count($inCir);
// 开始报数
$callNo = 0;
// 从第一个人开始报数
$peopleNo = 1;
// 出去的人人数
$outCir = 0;
// 当只有一个人的时候,停止循环
while($outCir !== $countPeople - 1) {
// 如果此人么有出去,则继续报号
if ($inCir[$peopleNo] == 1) {
$callNo++ ;
}
//如果此人报数为3 则设置为已经出去
if ($callNo === 3) {
$inCir[$peopleNo] = 0;
$outCir++;
// 重新开始报号
$callNo = 0;
}
// 该下一个人报号
$peopleNo = $peopleNo + 1;
// 如果到第10个人,则有重新回到第一个人
if ($peopleNo > $countPeople) {
$peopleNo = 1;
}
}
for ($i=1; $i<=$countPeople; $i++) {
if ($inCir[$i] == 1) {
echo $inCir[$i];
}
}



在做这个题目遇到的问题:  初始化报数从1开始,$callNo=1因为我想到的是从1开始报数。 这样做有一个问题是,第二个人就报3了,事实上应该是第三个人报3,这是为什么呢?
  因为,如果报数从1开始,检测第一个人是否被踢出去,自然没有被踢出去出去,报数变成2。 接下来,就是轮到第二个人,检测第二个人也没有出去,然后 注意,这个时候,报数变成3了,最终判定这个人要被踢出去,但此时这个人还是第二个人,报数增加1之后,才轮到下一人!!
  这个问题,就是报数报早了,所以 必须从0开始报。
页: [1]
查看完整版本: PHP实现 约瑟夫报数问题