C 语言实例 - 约瑟夫生者死者小游戏

C 语言实例 - 约瑟夫生者死者小游戏,第1张

问题描述:

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

解题思路:

该问题中有两个状态,上船与下船,因此需要对这两个状态分别进行标记,常用的即0与1,另需一个记数变量来结束循环,剩余15人为止。另需一变量来表示报数值,并当报数值为9的时候进行状态更改 *** 作。

给30个人编号1-30,使用数组a[30]={0}表示,用于存储每个人的报数值;

使用数组b[30]={0}标记每个人的状态,即在船上还是船下,,这里将每个人的初值标记为0(表示在船上)1表示下船;

i代表他们的编号,当i等于31时,手动将i置为1;

c代表被扔下船的人数(c=15时循环结束);

变量j用来记数,j=9时将对应编号i的人置 0(扔下船)并让j重新记数。

#include
 
int c = 0;//c代表被扔下船的人数
int i = 1;
int j = 0;
int a[30] = { 0 };
int b[30] = { 0 };
 
int main()
{
    while (i<=31)
    {
        if (i == 31)//当i等于31时,手动将i置为1
        {
            i = 1;
        }
        else if (c == 15)//c=15时跳出循环,循环结束
        {
            break;
        }
        else
        {
            if (b[i] != 0)//b[i]为1时,表示此人已下船,i加1,check不增加,继续循环
            {
                i++;
                continue;
            }
            else
            {
                j++;
                if (j != 9)
                {
                    i++;
                    continue;
                }
                else //j=9时将对应编号i的人标记为1,并记录其报数值9
                {
                    b[i] = 1;
                    a[i] = j;
                    j = 0;
                    printf("第%d号下船了\n", i);
                    i++;
                    c++;
                }
            }
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/3002933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存