热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

约瑟夫环三种做法

声明:图片及内容基于https:www.bilibili.comvideoav7835

声明:图片及内容基于https://www.bilibili.com/video/av78358478


题目概述

 



循环链表实现

#include
using namespace std;
typedef struct node{
int data;
struct node *next;
}Node,*Point; //typedef给链表起小名
int main(){
int n,m; //n只猴子数到m
int count=0; //answer的数组下标
int answer[301]; //储存答案
while(1){ //保持循环
cin>>n>>m;
if(n==0||m==0) break; //循环终止
else{
Point head,tail,p,q; //注意用小名声明结构体指针不要加 * (初始化头节点)
head=(Point)malloc(sizeof(Node)); //开辟哨兵节点
head->next=NULL;
tail=head; //尾指针指向哨兵节点
for(int i=0;i p=(Point)malloc(sizeof(Node)); //data是猴子的序号从1到n
p->data=i+1;
tail->next=p;
p->next=head->next; //循环链表
tail=p; //tail始终指向最后一个元素
}
p=head->next; //p指向第一个数据结点(非哨兵)
q=tail; //q是p的前驱
int i=1; //i记录数到几了
while(q!=p){ //只要前后指针没相遇即链表有两个以上节点
if(i==m){
q->next=p->next;
free(p); //释放空间
p=q->next;
i=1; //重新开始数
}else{
q=p;
p=p->next;
i++;
}
}
answer[count++]=p->data;
free(p); //别忘了把最后一个空间释放
head->next=NULL; //每次让头节点next为NULL是好习惯
}
}
for(int j=0;j cout< }
}

数组标志位实现

#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
int main() {
int n, m;
int number; //number=n
int count=1; //报数
int i, pos; //pos是数组下标
int ans[301], answer = 0;
while (~scanf("%d%d", &n, &m)) {
if (n == 0 || m == 0) break;
number = n;
int monkey[301] = { 0 };
for ( i = 0; i monkey[i] = i + 1; //monkey数组存的是猴子标号
}
pos = 0;
while (number > 1) { //存活多余一只猴子
if (monkey[pos] > 0) { //如果猴子活着
if (count != m) { //报数未到
count++;
pos = (pos + 1) % n;
}
else {
monkey[pos] = 0; //杀死
count = 1; //重新报数
number--; //猴子存活数减一
pos = (pos + 1) % n;
}
}
else {
pos = (pos + 1) % n;
}
}
for ( i = 0; i if (monkey[i] > 0) {
//printf("%d
", monkey[i]);
ans[answer++] = monkey[i];
}
}
}
for (i = 0; i cout < }
return 0;
}

数组模拟链表

#include
using namespace std;
int main() {
int n, m;
int ans[301], answer = 0;
while (1) {
cin >> n >> m;
if (n == 0 || m == 0) break;
int count = 1; //报数
int pos = 0; //数组前置下标
int prior = n - 1; //数组后置下标
int monkey[301] = { 0 };
for (int i = 0; i monkey[i] = (i + 1) % n; //是最后一个数据下标为0,实现模拟
} //循环链表
int number = n;
while (number > 1) {
if (count != m) { //如果报数没到m,pos和prior都向后移动
prior = pos;
pos = monkey[pos];//monkey[pos]存有pos的下一个位置
count++; //报数加一
}
else {
number--; //杀死
count = 1; //重新报数
monkey[prior] = monkey[pos]; //prior的下一位置变为原来pos的下一位置,跳过pos
pos = monkey[pos]; //pos后移一位
}
}
ans[answer++] = monkey[pos]+1; //注意加一
}
for (int i = 0; i cout < }
return 0;
}




推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
author-avatar
完颜777_870
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有