(H)实验1 约瑟夫环问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<A[i]<<" "; //输出出去的Leabharlann Baidu个人
for(k=i+1;k<j;k++) //每出去一个人,后面人的序号依次减一
A[k-1]=A[k];
}
cout<<"\n";
return 0;
}
程序运行:
原题:用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人求最后一个剩下的人是几号?
问题描述
设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。
int n,m;
cout<<"输入总人数n和出列数字m:\n";
cin>>n>>m;
for(int i=0;i<n;i++) //初始化数组
{
A[i]=i+1;
}
for(int j=n;j>0;j--) //循环结束调件为数组中元素个数为0
{
for(int k=1;k<m;k++)
i=(i+1)%j;
课后习题
请以O(n)的时间复杂度来实现约瑟夫问题。
源代码和程序
/*算法分析:
1.使用一个数组来存放数列;
2.每出去一人,后面人的序号依次加一,总人数减一,循环结束标志是数组中元素个数为0.
*/
#include<iostream>
using namespace std;
int main()
{
int A[50];
实验1约瑟夫环问题
背景
约瑟夫问题(Josephus Problem)据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
基本要求
需要基于线性表的基本操作来实现约瑟夫问题
需要利用数组来实现线性表
输入输出格式
输入格式:n,m
输出格式1:在字符界面上输出这n个数的输出序列
输出格式2:将这n个数的输出序列写入到文件中
选做内容
(1)使用单链表来实现之
(2)使用循环链表来实现之
测试用例
输入:10,3
输出:3 6 9 2 7 1 8 5 10 4
相关文档
最新文档