批处理解约瑟夫环应用题-shell

批处理解约瑟夫环应用题

题目如下

有二十九个女生(分别用1-29号来称呼)围成一圈玩报数游戏,规则是这样的:从1开始数数,当数到3的这个人就退出游戏,而她后面的人接着从1数。。。如此一直到最后剩下一个人,现在知道最初是从13号女生开始的游戏,问最后剩下的会是第几号女生?

编写代码

#! /bin/bash

N=29 # 总人数
M=13 # 开始号数
B=3  # 间隔3人死亡一次

# 初始化信息1-alive,0=dead
i=0
while [ ${i} -lt ${N} ]
do
        person[${i}]=1
        let i++
done

echo "================start====================="
echo "${#person[@]} 人"
echo "开始号数:${M}"
echo "间隔 ${B} 人死亡一次 "
echo "=========================================="

# 踢出人
leavePerson=${N}
let m=${M}-1   #数组下标为0
b=${B}



# 踢出只剩下一个人位置
until [ ${leavePerson} -eq 1 ]
do
        # 每隔三个人死亡一个人
        if [ ${b} -eq ${B} ]
        then
                # 踢出具体的某一个活人
                until [ ${person[${m}]} -eq 1 ]
                do
                        let m++
                        let m=${m}%${N} #防止数组越界
                done

                # 死亡
                echo "`expr $m + 1` 死亡"
                person[${m}]=0
                # 玩家人数减一
                let leavePerson--
                # 重新计数
                let b=1
        else
                #报数 
                until [ ${person[${m}]} -eq 1 ]
                do
                        let m++
                        let m=${m}%${N} #防止数组越界
                done
                let b++
        fi
        let m++
        let m=${m}%${N} #防止数组越界
done

# 找到最后一个人
index=0
while [ ${index} -lt ${N} ]
do
        if [ ${person[${index}]} -eq 1 ]
        then
                break
        fi

        let index++
done

echo "=================end======================"
echo "标号为:`expr ${index} + 1` 活着"
echo "=========================================="

运行结果

这里写图片描述

思路

  • 定义一个数组,所有值初始化为1,1表示活着,0表示死亡
  • 间隔3死亡
  • 输出最后一个活着

参考文档

数组使用:http://www.runoob.com/linux/linux-shell-array.html
until使用:http://www.runoob.com/linux/linux-shell-process-control.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值