约瑟夫问题栈

15个教徒与15个非教徒在深海遇险,必须将一半的人投入大海,其余的人才能幸免于难,于是想到一个方法,30个人围成一圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环直到余15个人为止,问怎么样排法,才能使每次投入大海的都是非教徒?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class CirculLinkedList
    {
        //元素个数
        private int count;

        //尾指针
        private Node tail;

        //当前节点的前节点
        private Node CurrPrev;

        //增加元素
        public void Add(object value)
        {
            Node newNode = new Node(value);
            if (tail==null)
            {//链表为空
                tail = newNode;
                tail.next = newNode;
                CurrPrev = newNode;
            }
            else
            {//链表不为空,把元素增加到链表结尾
                newNode.next = tail.next;
                tail.next = newNode;

                if (CurrPrev==tail)
                {
                    CurrPrev = newNode;
                }
                tail = newNode;
            }
            count++;
        }

        //删除当前元素
        public void RemoveCurrNode()
        {
            //为null代表为空表
            if (tail == null)
            {
                throw new NullReferenceException("集合中没有任何元素!");
            }
            else if (count==1)
            {
                tail = null;
                CurrPrev = null;
            }
            else
            {
                if (CurrPrev.next==tail)
                {
                    tail = CurrPrev;
                }
                CurrPrev.next = CurrPrev.next.next;
            }
            count--;
        }

        //当前节点移动步数
        public void Move(int step)
        {
            if (step<0)
            {
                throw new ArgumentOutOfRangeException("step", "移动步数不可为负数!");
            }
            if (tail==null)
            {
                throw new NullReferenceException("链表为空!");
            }
            for (int i = 0; i < step; i++)
            {
                CurrPrev = CurrPrev.next;
            }
        }

        //获得当前节点
        public object Current
        {
            get {return CurrPrev.next.item ;}
        }

        public override string ToString()
        {
            if (tail==null)
            {
                return string.Empty;
            }
            string s = "";
            Node temp = tail.next;
            for (int i = 0; i < count; i++)
            {
                s += temp.ToString() + "    ";
                temp = temp.next;
            }
            return s;
        }

        public int Count
        {
            get {return count ;}
        }

        private   class Node
        {
            public Node(object  value)
            {
                item = value;
            }
            //放置数据
            public object item;
            public CirculLinkedList.Node next;
            public override string ToString()
            {
                return item.ToString();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            CirculLinkedList lst = new CirculLinkedList();
            string s = string.Empty;
            Console.Write("请输入总数:");
            int count = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("请输入每次要报到几!");
            int m = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("报数开始~");

            for (int i = 1; i <= count; i++)
            {//构建循环列表
                lst.Add(i);
            }
            Console.WriteLine(lst.ToString());

            while (lst.Count>15)
            {
                lst.Move(m);
                s += lst.Current.ToString() + "      ";
                lst.RemoveCurrNode();//把报数的人扔入大海

              //  Console.WriteLine("剩余的人为: "+lst.ToString());
                Console.WriteLine(lst.Current + "开始报数!");

            }

            Console.WriteLine("被扔入大海的人为:"+s+lst.Current);
            Console.ReadLine();

        }
    }
}

约瑟夫问题栈,布布扣,bubuko.com

时间: 2024-12-29 15:56:35

约瑟夫问题栈的相关文章

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

数据结构与算法系列研究二——栈和队列

栈和队列的相关问题分析 一.栈和队列定义 栈和队列是两种重要的数据结构.从结构特性角度看,栈和队列也是线性表,其特殊性在于它们的基本操作是线性表的子集,是操作受限的线性表,可称为限定性的数据结构:从数据类型角度看,其操作规则与线性表大不相同,是完全不同于线性表的抽象数据类型.                    图1 栈的结构                                                 图2 队列的结构   1.1.栈是限定在表的一端进行插入和删除操作的线性

C++面试笔记--循环链表,队列,栈,堆

之前已经学会了单链表的建立删除插入转置以及一些普通操作,双链表和单链表差不多,就是多了一个前驱指针,在许多操作中很方便,但是加了一个指针开销应该会大一些,总体上影响不大,这里开始讨论循环链表以及其他的一些数据结构. 1.已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从k开始报数,数到m的那个人出列,依次重复下去,直到圆桌的人全部出列.试用C++编写实现. 解析:本题就是约瑟夫环问题的实际场景,要通过输入n.m.k三

php实现单,双向链表,环形链表解决约瑟夫问题

传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求不高 但是,如果你开发系统软件,比如(搜索/识别软件[图像,语言识别]/操作系统...)对数学高 建模.大量数学模型. 老师啊啊.我是学C++的.麻烦,谈哈对QT和MFC的看法嘛.前景什么的, 记住 : 打好基础,大有可为! 初中毕业能去传智学习吗? 学习It, 不管是java ,php ,c#,对

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

“全栈”工程师 请不要随意去做

今天我来给大家说说 "全栈工程师" 的事儿. 写这篇文的背景原因: 很简单就是最近越来越多的人想做[全栈工程师],他们的目标就是全栈,他们才入行短短1-2年,甚至刚从培训班出来:我的目标是做全栈,我啥都要学会,啥都会写,这样我就是大牛了,可以挣大钱,就算创业,我也不用招那么多人,一个人搞定一个产品,融资上市 ,CEO白富美,balabala... 我给他的回复是: 去你xx的,你连JS 数组和对象用法都搞不清,抄几个效果,看几个视频教程摸索摸索就要做万能人了? "全栈&quo

一个不简洁的约瑟夫环解法

约瑟夫环类似模型:已知有n个人,每次间隔k个人剔除一个,求最后一个剩余的. 此解法为变种,k最初为k-2,之后每次都加1. 例:n=5,k=3.从1开始,第一次间隔k-2=1,将3剔除,第二次间隔k-1=2,将1剔除.依此类推,直至剩余最后一个元素. 核心思路:将原列表复制多份横向展开,每次根据间隔获取被剔除的元素,同时将此元素存入一个剔除列表中.若被剔除元素不存在于剔除列表,则将其加入,若已存在,则顺势后移至从未加入剔除列表的元素,并将其加入.如此重复n-1次.面试遇到的题,当时只写了思路,没

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v