/*约瑟夫环
(问题描述)
约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任意选
一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新
的m值,从他在顺时针方向下一个人开始从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
(基本要求)
利用单向循环链表存储结构模拟此过程,按照出列顺序印出个人的编号。
(测试数据)
m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m为6(正确的出列顺序应为6,1,4,7,2,3,5)。

下面是我的解决方法:
根据问题所描述的,这是个环问题,我们可以先模拟一个环.
声明:我这里是用双向链表的,虽然对这个问题没太大意义,但我还是保留为双向的,因为我在考虑这个问题可以衍生出很多其它问题来,只为我自己所用而以。呵呵……为了性能,而且只是解决这一个问题,你可以改成单向链表。

public class Circle
    {
        public class Node
        {
            private Node preNode;
            private Node nextNode;

private int id;
            private uint password;

public Node PreNode
            {
                get {
                    return preNode;
                }
                set {
                    preNode = value;
                }
            }

public Node NextNode {
                get {
                    return nextNode;
                }
                set {
                    nextNode = value;
                }
            }

public int ID
            {
                get {
                    return id;
                }
                set {
                    id = value;
                }
            }

public uint Password
            {
                get {
                    return password;
                }
                set {
                    password = value;
                }
            }
           
        }
        private Node firstNode = null;
        private Node lastNode=null;
        private Node nextNode = null;
        private int count = 0;

public int Count
        {
            get {
                return count;
            }
            set {
                count = value;
            }
        }

public Circle()
        {
        
        }

public void Add(int id,uint password)
        {
            count++;
             Node node = new Node();
             node.ID = id;
             node.Password = password;

this.Add(node);
        }

public void Add(int id)
        {
            count++;
            Node node = new Node();
            node.ID = id;
            this.Add(node);
           
        }

private void Add(Node node)
        {
            if (firstNode == null)
            {

firstNode = node;
                lastNode = firstNode;

lastNode.NextNode = firstNode;
                lastNode.PreNode = firstNode;

firstNode.NextNode = lastNode;
                firstNode.PreNode = lastNode;
            }
            else
            {
                lastNode.NextNode = node;

node.PreNode = lastNode;
                node.NextNode = firstNode;

firstNode.PreNode = node;
                lastNode = node;
            }
        }

public Node NextNode()
        {
            Node node=new Node();
            if (nextNode == null)
            {
                node = firstNode;
                nextNode = firstNode.NextNode;
              
            }
            else
            {
                node = nextNode;
                nextNode = node.NextNode;
            }
            return node;
        }

public void RemoveNode(Node node)
        {
            count--;
            Node _preNode = node.PreNode;
            Node _nextNode = node.NextNode;
            _preNode.NextNode = _nextNode;
            _nextNode.PreNode = _preNode;
        }

//pre node;current node;next node
        //first node-pre->last node
    }

2。根据问题加载数据

 List<Circle.Node> outList = new List<Circle.Node>();
            int index = 0;
            int n = 7;
            uint m = 20;

List<Circle.Node> nodeList = new List<Circle.Node>();
            Circle.Node nd = new Circle.Node();
            nd.ID = 1;
            nd.Password = 3;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 2;
            nd.Password = 1;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 3;
            nd.Password = 7;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 4;
            nd.Password = 2;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 5;
            nd.Password = 4;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 6;
            nd.Password = 8;
            nodeList.Add(nd);

nd = new Circle.Node();
            nd.ID = 7;
            nd.Password = 4;
            nodeList.Add(nd);

Circle c = new Circle();
            foreach (Circle.Node node in nodeList)
            {
                c.Add(node.ID, node.Password);
            }

3.根据问题事件开始起动

 
while (c.Count > 0)                        {                            index++;                            nd = c.NextNode();                            if (index == m)                            {                                c.RemoveNode(nd);                                outList.Add(nd);                                index = 0;                                m = nd.Password;                            }                        }

4.显示结果

 foreach (Circle.Node node in outList)
            {
                Console.WriteLine(node.ID);
            }
 

完整源代码:

 
using System;            using System.Collections.Generic;            using System.Text;namespace Arithmetic            {                class Program                {                    static void Main(string[] args)                    {            List<Circle.Node> outList = new List<Circle.Node>();                        int index = 0;                        int n = 7;                        uint m = 20;            List<Circle.Node> nodeList = new List<Circle.Node>();                        Circle.Node nd = new Circle.Node();                        nd.ID = 1;                        nd.Password = 3;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 2;                        nd.Password = 1;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 3;                        nd.Password = 7;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 4;                        nd.Password = 2;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 5;                        nd.Password = 4;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 6;                        nd.Password = 8;                        nodeList.Add(nd);            nd = new Circle.Node();                        nd.ID = 7;                        nd.Password = 4;                        nodeList.Add(nd);             Circle c = new Circle();                        foreach (Circle.Node node in nodeList)                        {                            c.Add(node.ID, node.Password);                        }            while (c.Count > 0)                        {                            index++;                            nd = c.NextNode();                            if (index == m)                            {                                c.RemoveNode(nd);                                outList.Add(nd);                                index = 0;                                m = nd.Password;                            }                        }            foreach (Circle.Node node in outList)                        {                            Console.WriteLine(node.ID);                        }                        Console.Read();                    }                }    public class Circle                {                    public class Node                    {                        private Node preNode;                        private Node nextNode;            private int id;                        private uint password;            public Node PreNode                        {                            get {                                return preNode;                            }                            set {                                preNode = value;                            }                        }            public Node NextNode {                            get {                                return nextNode;                            }                            set {                                nextNode = value;                            }                        }            public int ID                        {                            get {                                return id;                            }                            set {                                id = value;                            }                        }            public uint Password                        {                            get {                                return password;                            }                            set {                                password = value;                            }                        }                                            }                    private Node firstNode = null;                    private Node lastNode=null;                    private Node nextNode = null;                    private int count = 0;                           public int Count                    {                        get {                            return count;                        }                        set {                            count = value;                        }                    }        public Circle()                    {                                         }        public void Add(int id,uint password)                    {                        count++;                         Node node = new Node();                         node.ID = id;                         node.Password = password;             this.Add(node);                    }        public void Add(int id)                    {                        count++;                        Node node = new Node();                        node.ID = id;                        this.Add(node);                                            }        private void Add(Node node)                    {                        if (firstNode == null)                        {                firstNode = node;                            lastNode = firstNode;                lastNode.NextNode = firstNode;                            lastNode.PreNode = firstNode;                firstNode.NextNode = lastNode;                            firstNode.PreNode = lastNode;                        }                        else                        {                            lastNode.NextNode = node;                node.PreNode = lastNode;                            node.NextNode = firstNode;                firstNode.PreNode = node;                            lastNode = node;                        }                    }        public Node NextNode()                    {                        Node node=new Node();                        if (nextNode == null)                        {                            node = firstNode;                            nextNode = firstNode.NextNode;                                                   }                        else                        {                            node = nextNode;                            nextNode = node.NextNode;                        }                        return node;                    }        public void RemoveNode(Node node)                    {                        count--;                        Node _preNode = node.PreNode;                        Node _nextNode = node.NextNode;                        _preNode.NextNode = _nextNode;                        _nextNode.PreNode = _preNode;                    }        //pre node;current node;next node                    //first node-pre->last node                }            }

总结:当碰到问题时,思路理清。程序只不过是解决问题的工具,当你分析到问题本质,还原问题真相,有时会给你海阔天空的感觉。不要一味的去为写代码而写代码,写代码是为了解决问题,呵呵……
      用“面向对象”来思考问题,解决问题,把问题分层,分块,这样你的思路就清晰得多。
      以上代码只是做为参考,如果你有兴趣,可以写得更完善一些。

约瑟夫环C#解决方法的更多相关文章

  1. php解决约瑟夫环

    今天偶遇一道算法题 "约瑟夫环"是一个数学的应用问题:一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把 ...

  2. poj 3517 约瑟夫环

    最简单的约瑟夫环,虽然感觉永远不会考约瑟夫环,但数学正好刷到这部分,跳过去的话很难过 直接粘别人分析了 约瑟夫问题: 用数学方法解的时候需要注意应当从0开始编号,因为取余会等到0解. 实质是一个递推, ...

  3. 用pl/sql游标实现约瑟夫环

    什么是约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为1的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数, ...

  4. 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

    本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...

  5. Java实现约瑟夫环

    什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个 ...

  6. C++ 约瑟夫环

    约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周 ...

  7. 51nod 1073 约瑟夫环

    题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大( ...

  8. POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环

    题目链接: https://cn.vjudge.net/problem/POJ-2886 题目大意: N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数 ...

  9. "递归"实现"约瑟夫环","汉诺塔"

    一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...

随机推荐

  1. PHP合并两张图片(水印)

    $dst_im = "http://img6.cache.netease.com/photo/0001/2016-04-15/BKMTUO8900AP0001.jpg"; $src ...

  2. C# XML序列化

    /// <summary> /// XML序列化为指定对象 /// Author:taiyonghai /// Time:2016-08-22 /// </summary> / ...

  3. less使用ch1--简单使用

    1 ku.less .reset(){ *{margin:0;padding:0;} ul.ol{list-style: none;} a{text-decoration: none;} img{bo ...

  4. HDU3844Tour (好题)

    题意:   有N个点,M个单向边,现在要你设计N条路线覆盖所有的点,每个点都属于且值属于一个环.(为什么是N条边:和最小生成树为什么有N-1条边是一样的证明). 解析:  每个点都有一个喜欢对象(出度 ...

  5. Echarts数据可视化地理坐标系geo,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  6. ViewPager使用记录1——展示固定数据

    ViewPager是v4支持库中的一个控件,相信几乎所有接触Android开发的人都对它不陌生.之所以还要在这里翻旧账,是因为我在最近的项目中有多个需求用到了它,觉得自己对它的认识不够深刻.我计划从最 ...

  7. Linux入门(16)——Ubuntu16.04下配置sublime text 3使用markdown

    sublime text 3安装两个插件: MarkDown Editing OmniMarkupPreviewer 有的人使用 MarkDown Editing markdownpreviewer ...

  8. LINUX 笔记-wget命令

    使用wget下载单个文件 命令:wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip 使用wget -c断点续传 命令:wget -c http: ...

  9. LINUX 软件管理

    dpkg 安装 dpkg -i package.deb 卸载 dpkg -r packagename 彻底卸载 dpkg -P packagename apt-get 搜查包 apt-cache se ...

  10. [poj1644]放苹果

    题目链接:http://poj.org/problem?id=1664       把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...