📄 约瑟夫生者死者游戏.cpp
字号:
//约瑟夫生者死者游戏
// 每30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,
//只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,
//并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海,
//然后再从他的下一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,
//直到剩下15个乘客为止。问哪些位置是将扔下大海的位置。
#include<iostream>
using namespace std;
struct game
{
int whether; //记录是否被扔下海。1表示没有被扔下海。0表示被扔下海//
int next; //指向下一个人的指针//
}; /*30个人,0号元素没有使用*/
struct game
number[31]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
int main()
{
int i,j,m;
cout<<"\n";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cout<<"\n";
cout<<" ---------------------王萍-------------学号:054100626------------------\n";
cout<<"\n";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cout<<"\n";
cout<<" 约瑟夫生者死者游戏结果:\n";
cout<<"\n";
for(i=1;i<=30;i++) //初始化结构数组//
{
number[i].whether=1; //标志置为1,表示人都在船上//
number[i].next=i+1; //指针指向下一个人//
}
number[30].next=1; //为了构成环使第30个人的指针指向第一个人//
j=31; //j:指向已经处理完毕的数组元素,从number[i]指向的人开始计数//
for(i=0;i<15;i++) //i:记录已经被扔下海的人数计数器//
{
for(m=6;;) //m:决定被扔下海的人的计数器//
if(m<15)
{
j=number[j].next; //改指针,取下一个人//
m=m+number[j].whether; //计数,已扔下海的人计标记为0//
}
else break; //计数到15则停止计数//
number[j].whether=0; //标记置 0,表示该人被扔下海//
}
for(i=1;i<=30;i++) //输出结果//
cout<<number[i].whether? '1':'0'; //0:被扔下海, 1:留在船上//
cout<<"\n";
system("pause");
cout<<"\n";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -