c#解决约瑟夫环问题(杀人游戏)

文章讲述了两种编程方法来解决14个人手拉手围成一圈,按1-3报数,喊到3的人退出的游戏问题。通过初始化数组,设置计数器和下标,不断迭代直到只剩一人。第一种方法利用i%people防止下标越界,第二种方法加入条件判断优化。关键在于数组值的变化和循环控制。
摘要由CSDN通过智能技术生成

问题:14个人手拉手围成一圈,每个人的序号分别是1-14,开始报数字1-3,喊道3的人退出圈子,问最后剩下的那个人是谁

该题代码如下:

方法一:

Console.WriteLine("请输入多少个人参加游戏");
                int people = int.Parse(Console.ReadLine());
                int[] arr = new int[people];  //定义一个十四个人的数组
                int num = 0;     //记录数字1-3
                int i = 0;       //记录i增加
                int count = 1;   //记录出局的人数
                while (count < people)        //出局人数达到就结束
                {                          //  i取模于14是让他多次从0-13循环
                    if (arr[i % people] == 0)    //arr初始值均为0,当arr数组中的数值为1的时候不计数,只记数没有被淘汰的
                    {
                        num++;            //计数+1
                    }
                    if (num == 3)
                    {
                        arr[i % people] = 1;  //点到3的出局
                        num = 0;        //重新计数
                        count++;        //出局人数加一
                    }
                    i++;
                }
                for (int j = 0; j < arr.Length; j++)
                {
                    if (arr[j] == 0)        //未出局的人
                    {
                        Console.Write("最后剩余的人是");
                        Console.WriteLine("第" + (j + 1) + "位");
                    }
                }

输出结果:

 方法二:

int num = 14;
                int[] arr = new int[num];
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = i + 1;
                }
                int index = 0;   //下标
                int n = 1;      //计数1-3
                int count = 0;  //记录淘汰的人数
                while (true)
                {
                    if (arr[index]<0)    //淘汰的人不参与循环,不进行记数1-3
                    {
                        index++;          //但是下标依旧往下进行
                        if (index >= num) //如果下标超出范围,则返回第一个,组成一个圆圈
                        {
                            index = 0;
                        }
                        continue;     //循环继续
                    }
                    if (n==3)        //当计数为3的时候,淘汰,即让他值不为原先的数,以此来判断
                    {
                        arr[index] = -1;
                        count++;
                    } 
                    if (count==13)   //当淘汰的人数达到13人时,结束循环
                    {
                        break;
                    }
                    n++;          //计数持续进行
                    if (n>3)     //当超出3时,重新计数1
                    {
                        n = 1;
                    }                   
                    index++;    //下标持续增加
                    if (index>=num)   //当下标超出范围时,下标归0。
                    {
                        index = 0;
                    }
                }
                for (int i = 0; i < arr.Length; i++)   //输出数组内的所有数字,不是-1的即为最后的那个人
                {
                    Console.WriteLine(arr[i]);
                }

第二种方法的改进:代码如下

int num = 14;
                int[] arr = new int[num];
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = i + 1;
                }
                int index = 0;   //下标
                int n = 1;      //计数1-3
                int count = 0;  //记录淘汰的人数
                while (true)
                {
                  if (arr[index]>0)    //只有不淘汰的人进行循环
                  {
                    if (n==3)        //当计数为3的时候,淘汰,即让他值不为原先的数,以此来判断
                    {
                        arr[index] = -1;
                        count++;
                    } 
                    if (count==13)   //当淘汰的人数达到13人时,结束循环
                    {
                        break;
                    }
                    n++;          //计数持续进行
                    if (n>3)     //当超出3时,重新计数1
                    {
                        n = 1;
                    }
                  }                  
                    index++;    //下标持续增加
                    if (index>=num)   //当下标超出范围时,下标归0。
                    {
                        index = 0;
                    }
                    
                }
                for (int i = 0; i < arr.Length; i++)   //输出数组内的所有数字,不是-1的即为最后的那个人
                {
                    Console.WriteLine(arr[i]);
                }

运行结果:

 该题注意的地方为:

1.当使用第一个代码时需要注意的地方是,理解i%people这个点,该点是让下标不能超过数组的界限,当i=0时,同样可以运行,运行结果为下标0。

2.第一个代码也可以带入数值,但是没有必要,当点到3时,数组的值为1,为1即为淘汰;

3.第二个代码需要注意的地方为continue的用法,continue的用法为在循环语句中,continue只执行到该行代码,不执行下面的代码,但依旧进行下一次的循环。

4.还有下标和报数1-3,记得需要回归原来的数字,不能超出范围;

5.第二个代码的改进需要注意的点为是当数组的值大于0时才运行,因为刚开始的时候给其赋值了,淘汰的均为-1,所以说大于0能够往下运行,该地方还要注意的是,if判断的位置不包括下面的index++;因为无论是否进行计数,下标依旧在持续增加。

6.细心细心再细心,逻辑逻辑再逻辑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值