批处理解约瑟夫环应用题
题目如下
有二十九个女生(分别用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