一.课程设计题目和内容
26.敢死队问题(限 1 人完成)
有 M 个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决
定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个
战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到 5 时,对应的战士
就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士
开始数数,被数到第 5 时,此战士接着去执行任务。以此类推,直到任务完成为止。
排长是不愿意去的,假设排长为 1 号,请你设计一程序,求出从第几号战士开始计数
才能让排长最后一个留下来而不去执行任务。
要求:至少采用两种不同的数据结构的方法实现。如果采用三种以上的方法者,可加分。
二.程序中所采用的数据结构及存储结构的说明
程序中的数据分别采用三种不同的方式解决同一个问题,分别是循环单链表储存结构、
线性表储存结构、循环队列储存结构。
循环单链表是单链表的另一种形式,其结构特点链表中最后一个结点的指针域不再是
结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循
环链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除
操作较为方便。
线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关
系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接
的。线性表的逻辑结构简单,便于实现和操作。
循环向量是将向量空间想象为一个首尾相接的圆环。而存储在其中的队列称为循环队
列(Circular Queue)。 其目的是为了充分利用向量空间,克服"假溢出"现象的出现。
三.算法的设计思想
通过分析问题可知问题的实质是约瑟夫环问题
为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n 个人(编号 0~(n-1)),从 0 开始报数,报到(m-1)的退出,剩下的人继
续从 0 开始报数。求胜利者的编号。
我们知道第一个人(编号一定是 m%n-1) 出列之后,剩下的 n-1 个人组成了一个新的
约瑟夫环(以编号为 k=m%n 的人开始):