【好记性不如烂笔头】约瑟夫环问题之形象解法(其实就是实实在在的模拟一下游戏过程)

简介: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 约瑟夫环游戏 8 { 9 class Program 10 { 11 /* 12 * 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace 约瑟夫环游戏
  8 {
  9     class Program
 10     {
 11         /*
 12          * 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
 13          * 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重
 14          * 复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
 15          * 约瑟夫环运作如下:
 16               1、一群人围在一起坐成[2]  环状(如:N)
 17               2、从某个编号开始报数(如:K)
 18               3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
 19               4、一直循环,直到所有人出列[3]  ,约瑟夫环结束
 20          * 
 21          * 实现思路:
 22          *      1,创建节点类,创建环(JosephCir)类,在JosephCir环内实现环的连接,提供游戏开始方法
 23          *      2,游戏开始,丢……
 24          *      3,当环当前长度LengthNow为1时,游戏结束,返回最后胜出同学的节点。
 25          */
 26         static void Main(string[] args)
 27         {
 28             JosephCir j = new JosephCir(3,1,4);
 29 
 30             Console.WriteLine("游戏开始!");
 31             Node n = j.GameStart();
 32 
 33             if (n != null)
 34                 Console.WriteLine("游戏胜出同学的编号为:"+n.Data);
 35             else
 36                 Console.WriteLine("游戏失败");
 37 
 38             Console.ReadKey();
 39         }
 40 
 41     }
 42     /*约瑟夫环*/
 43     class JosephCir
 44     {
 45         public int LengthNow { get; set; }/*环当前长度,如果环长为1则表示游戏结束*/
 46         public Node head;/*1号同学节点*/
 47         public Node now;/*即手绢所在同学节点*/
 48         public int Total { get; set; }/*总共玩游戏的人数*/
 49         public int Start { get; set; }/*从该编号开始游戏*/
 50         public int PlayNum { get; set; }/*每次游戏丢PlayNum次手绢*/
 51 
 52         /*创建约瑟夫环*/
 53         public JosephCir(int total,int start,int playNum)
 54         {
 55             this.Total = total;
 56             this.Start = start;
 57             this.PlayNum = playNum;
 58             this.LengthNow = total;
 59             head = new Node(1);
 60             now = head;
 61             for (int i = 1; i < total; i++) 
 62             {
 63                 Node temp = new Node(i+1);
 64                 now.next = temp;
 65                 now = temp;
 66             }
 67             now.next = head;
 68             /*now 和head指向1号编号同学*/
 69             now = head;
 70         }
 71 
 72         /*游戏开始,结束时返回游戏胜出的Node*/
 73         public Node GameStart()
 74         {
 75             if (head == null) return null;
 76 
 77             /*将手绢发给开始的那个人*/
 78             for (int i = 0; i < Start-1; i++)
 79             {
 80                 now = now.next;
 81             }
 82 
 83             /*开始游戏*/
 84             while (LengthNow > 1)
 85             {
 86                 for (int i = 0; i < PlayNum - 1; i++)
 87                     now = now.next;
 88 
 89                 now.next = now.next.next;
 90                 now = now.next;
 91                 LengthNow -= 1;
 92             }
 93             if(LengthNow==1&&now!=null)
 94                 return now;
 95             return null;
 96         }
 97     }
 98     /*节点类*/
 99     class Node
100     {
101         public Node next;
102         public int Data { get; set; }
103         public Node(int data)
104         {
105             this.Data = data;
106         }
107     }
108 }

还有很多解法,个人觉得这是最易懂的一种……

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
7月前
|
机器学习/深度学习 Java Python
代码解密 | 2024春晚刘谦魔术与约瑟夫环问题
2024春节联欢晚会中,刘谦老师的魔术节目可以说是我心目中的全场最佳~春晚刚结束网上就有大佬给出了第二个魔术(拼扑克牌)的数学模拟,也有大佬发布了代码程序。博主在模拟了魔术过程之后,也在此分享一下程序代码和思路。同时,也借此回顾一下经典的数学问题:约瑟夫环问题。
112 8
|
7月前
【错题集-编程题】过河卒(动态规划-路径问题)
【错题集-编程题】过河卒(动态规划-路径问题)
|
存储 C++ 容器
五道超经典题目,带你手撕链表题(多种方法实现)下
五道超经典题目,带你手撕链表题(多种方法实现)
63 1
|
消息中间件 前端开发 NoSQL
八股乱背,力扣不会!下辈子远离计算机
八股乱背,力扣不会!下辈子远离计算机
58 0
|
算法 Java Android开发
数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟
这道题是 LeetCode 上的 [1040. 移动石子直到连续 II](https://leetcode.cn/problems/moving-stones-until-consecutive-ii/),难度是 Meduium,难度分是 2455。虽然是 Medium 题,但是打 Hard 标签一点也不为过。长期作为中等题的难度 Top1,直到去年被 [2289. 使数组按非递减顺序排列 ](https://leetcode.cn/problems/steps-to-make-array-non-decreasing/) 题挤下来。
90 0
数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟
|
存储 算法 C语言
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
五道超经典题目,带你手撕链表题(多种方法实现)上
五道超经典题目,带你手撕链表题(多种方法实现)
114 0
四道好题分享(看似简单,但是棘手)
四道好题分享(看似简单,但是棘手)
105 0
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
|
机器学习/深度学习 算法 索引
【刷题】环形链表 龟兔赛跑算法打开新世界的大门
【刷题】环形链表 龟兔赛跑算法打开新世界的大门
116 0
【刷题】环形链表 龟兔赛跑算法打开新世界的大门