重庆大学2013级计算机科学约瑟夫问题实验报告

需积分: 10 1 下载量 155 浏览量 更新于2024-09-10 收藏 56KB DOC 举报
约瑟夫问题是一个经典的计算机科学理论问题,源自古罗马时期的历史故事,通常用于解释算法设计中的循环移位和概率计算。在给出的实验报告中,它是重庆大学2013级计算机科学与技术专业的一门课程项目,由学生鲁全独立完成,指导教师为涂风华。该项目的主要目标是利用C++编程和数据结构知识,解决约瑟夫环问题,即在一个编号为1到n的圆圈上,参与者按照顺时针方向报数,每报到一个特定数字m后,该人会被淘汰并成为下一个报数的起点,直至所有人都出局。 实验内容包括以下关键知识点: 1. **问题背景**:理解问题的基本规则,例如初始人数n,报数上限m,以及人员被淘汰后游戏的迭代过程。 2. **算法设计**:设计并实现一个算法来模拟这个过程,这可能涉及循环、条件判断和递归等编程技巧。常见的解决方案有埃拉托斯特尼筛法或者欧几里得算法,它们通过计算循环周期来确定最终存活者的编号。 3. **数据结构应用**:利用数组或链表等数据结构来存储参与者的状态,以便在报数过程中更新和删除。 4. **代码实现**:使用C++语言编写清晰、可维护的代码,确保程序的正确性和效率。这包括输入验证、错误处理和代码注释。 5. **分工合作**:实验要求以团队形式进行,项目组长需要协调团队成员,明确分工,确保每个成员的工作负载均衡。 6. **文档编写**:提交实验报告时,需要撰写详细的设计文档,包括问题描述、算法分析、实现步骤、测试结果以及遇到的问题和解决方案。这涉及到文档撰写规范和图表表达的清晰度。 7. **答辩准备**:为了得到高分,学生还需要准备实验演示和答辩,展示自己的专业知识和对项目的深入理解。 8. **评估标准**:实验成绩评估主要依据学生的编程能力、解决问题的能力、团队协作、文档质量和答辩表现等多个维度。 通过这个项目,学生不仅可以提升编程技能,还能锻炼逻辑思维、抽象思考和解决问题的能力,同时了解算法在实际问题中的应用。
2007-04-04 上传
约瑟夫问题全集 據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺身亡為止。 然而Josephus 和他的朋友並不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。 約瑟夫問題可用代數分析來求解,將這個問題擴大好了,假設現在您與m個朋友不幸參與了這個遊戲,您要如何保護您與您的朋友?只要畫兩個圓圈就可以讓自己與朋友免於死亡遊戲,這兩個圓圈內圈是排列順序,而外圈是自殺順序,如下圖所示: 使用程式來求解的話,只要將陣列當作環狀來處理就可以了,在陣列中由計數1開始,每找到三個無資料區就填入一個計數,直而計數達41為止,然後將陣列由索引1開始列出,就可以得知每個位置的自殺順序,這就是約瑟夫排列,41個人而報數3的約琴夫排列如下所示: 14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23 由上可知,最後一個自殺的是在第31個位置,而倒數第二個自殺的要排在第16個位置,之前的人都死光了,所以他們也就不知道約琴夫與他的朋友並沒有遵守遊戲規則了。 c #include <stdio.h> #include <stdlib.h> #define N 41 #define M 3 int main(void) { int man[N] = {0}; int count = 1; int i = 0, pos = -1; int alive = 0; while(count <= N) { do { pos = (pos+1) % N; // 環狀處理 if(man[pos] == 0) i++; if(i == M) { // 報數為3了 i = 0; break; } } while(1); man[pos] = count; count++; } printf(\"\\n約琴夫排列:\"); for(i = 0; i < N; i++) printf(\"%d \", man[i]); printf(\"\\n\\n您想要救多少人?\"); scanf(\"%d\", &alive); printf(\"\\nL表示這%d人要放的位置:\\n\", alive); for(i = 0; i < N; i++) { if(man[i] > alive) printf(\"D\"); else printf(\"L\"); if((i+1) % 5 == 0) printf(\" \"); } p rintf(\"\\n\"); return 0; } java public class Josephus { public static int[] arrayOfJosephus( int number, int per) { int[] man = new int[number]; for(int count = 1, i = 0, pos = -1; count <= number; count++) { do { pos = (pos+1) % number; // 環狀處理 if(man[pos] == 0) i++; i f(i == per) { // 報數為3了 i = 0; break; } } while(true); man[pos] = count; } return man; } public static void main(String[] args) { int[] man = Josephus.arrayOfJosephus(41, 3); int alive = 3; System.out.println(\"約琴夫排列:\"); for(int i = 0; i < 41; i++) System.out.print(man[i] + \" \"); System.out.println(\"\\nL表示3個存活的人要放的位置:\"); for(int i = 0; i < 41; i++) { if(man[i] > alive) System.out.print(\"D\"); else System.out.print(\"L\"); if((i+1) % 5 == 0) System.out.print(\" \"); } System.out.println(); }}
2024-11-06 上传
springboot052基于Springboot+Vue旅游管理系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。