热门标签 | 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;
}




推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
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社区 版权所有