c语言-猴子选大王-约瑟夫问题(队列,链表,数组)
猴子选大王
前言:初读此题,根据题意,顺势想到了用刚学的数据结构中的循环队列及循环链表,便想借此来熟练一下新学知识。
题目描述:
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?解题思路:循环队列,循环链表,数组三种解题思路。
循环队列法
思路:借助队列的概念,前出后进,若报数的猴子不是3,则先出队再入队,若是3,直接出队。借助变量k来记录猴子所报的数,开始置为0,每一次循环k++,若k=3,删除对头(即出队)再将k置为0。以下图解配和代码食用更加美味。(此处以n=7为例)
#include<stdio.h>
typedef struct Queue
{int* base;//初始化的动态分配储存空间int rear;//对尾,指向队尾元素的下一个位置int front;//对头,指向队列头元素
}Queue;
void EnQueue(Queue* Q,int x)
{//因为此题队列元素只会少不会多,在此就不判读队满Q->base[Q->rear] = x;Q->rear = (Q->rear + 1) % n;}
int DeQueue(Queue* Q)
{int e = Q->base[Q->front];Q->front = (Q->front + 1) % n;return e;
}
int QueueLength(Queue* Q)
{return (Q->rear - Q->front + n) % n;
}
int Monkey1()
{Queue Q;Q.base = (int*)malloc(n * sizeof(int));Q.front = Q.rear = 0;for (int i = 1; i < n; i++){EnQueue(&Q, i);}int k = 0;while (QueueLength(&Q) > 1){k++;if (k == 3){DeQueue(&Q);k = 0;}else{EnQueue(&Q, DeQueue(&Q));}}return Q.base[Q.front];
}
int n;//全局变量
int main(void)
{scanf("%d", &n);n++;//因此循环队列要留一空元素空间进行判断是否队列满,所以++,以便后续开辟空间和Q.front和Q.rear的循环移动int ret=Monkey1();printf("%d\n", ret);return 0;
}
- 循环链表法(最易理解,最符合题目需求)
思路:借助循环链表可以高效实现环中结点的删除。因单向链表可以较为简便的删除某结点之后的结点,不易实现删除当前结点(也可以使用双向链表),所以在此将k初始化为1,以实现删除报数为3的结点。与上面的思路类似,当k=3时,删除当前结点的下一结点,再将k置为1,往下依次类推。图解请配合代码一起食用。
#include<stdio.h>
int n;//全局变量
typedef struct ListNode
{int data;struct ListNode* next;
}LNode;
LNode* BuyLNode(int x)
{LNode* new = (LNode*)malloc(sizeof(LNode));new->next = NULL;new->data = x;return new;
}int Monkey2()
{int i = 0;LNode* phead = BuyLNode(i);LNode* cur = phead;for (i = 1; i <= n; i++){cur->next = BuyLNode(i);cur = cur->next;}cur->next= phead->next;//最后链接到头上cur = phead->next;int k =1;//因此链表为单向链表,只能删除下一个结点,所以在此将k置为1;while (cur->next != cur){k++;if (k == 3){//删除下一个结点LNode* next = cur->next->next;free(cur->next);cur->next = next;cur = cur->next;k = 1;}else{cur = cur->next;}}return cur->data;
}
int main(void)
{scanf("%d", &n);int ret = Monkey2();printf("%d\n", ret);return 0;
}
- 普通方法(数组法,实现简单)
思路:创建一个n+1(自己输入)个空间大小整型数组,将数从1到赋值到n给猴子编号,设置两个变量,一个变量k记录报数,另一个变量count记录猴子个数,k初始为0,还是当k=3时,删除当前元素(猴子),即将当前元素置为0,再将k置为0,依次类推。当count=1时跳出循环,完成题解。
#include<stdio.h>
int n;
int Monkey3()
{int* arr = (int*)malloc((n+1)*sizeof(int));int i;for (i = 1; i <= n; i++){arr[i] = i;}int k = 0;int count = n;while (count > 1)//不断的遍历数组,直到猴子数为1{for (i = 1; i <= n; i++){if (arr[i] == 0){//当arr[i]=0,即说明此编号为i的猴子已被淘汰,直接i++跳到下一个猴子continue;}k++;if (k == 3){arr[i] = 0;count--;//猴子数减一k = 0;}}}for (i = 1; i <= n; i++){//找出不为0的元素,即为猴王if (arr[i] != 0)return arr[i];}}
int main(void)
{scanf("%d", &n);int ret = Monkey3();printf("%d\n", ret);return 0;
}
如有错误欢迎指出,或提出你的解题思路或看法。
c语言-猴子选大王-约瑟夫问题(队列,链表,数组)相关推荐
- 猴子选大王--约瑟夫问题浅析
猴子选大王--约瑟夫问题浅析 猴子选大王问题是一个十分经典的算法问题,这个问题是这样的:一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N ...
- 蓝桥杯 - 猴子选大王 (约瑟夫问题)
标题:猴子选大王 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始 ...
- c语言猴子选大王注释,猴子选大王问题(C语言实现)
题目大概是这样的: n只猴子(n不超过50)围成一个圈.从某一只开始依次给猴子们编号,从1到n.然后从第一只猴子开始,从1开始依次报数,报到m的猴子离开圈子.从这只离开的猴子的下一只开始再从1开始报数 ...
- c语言猴子选大王指针,C语言描述怎么用循环队列实现猴子选大王
匿名用户 1级 2016-12-16 回答 #include #include typedef struct node//定义链表节点类型 { int data; struct node *next; ...
- 【PHP版·猴子选大王·约瑟夫环】 一堆猴子都有编号,编号是1,2,3 ...m
一.问题: n只猴子围坐成一个圈,按顺时针方向从1到n编号. 然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数, 如此重复,直至剩下一个猴子,它就是 ...
- java线性表猴子选大王,线性表应用:约瑟夫问题(猴子选大王)(循环链表,数组,递归)...
1 描述:一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报 ...
- 猴子选王c语言链表程序代码,C语言程序设计-猴子选大王[链表应用]
2032 猴子选大王 Description 有N只猴子,从1~N进行编号.它们按照编号的顺时针方向排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报的第一个数字为1,以后每只猴子报的数字都是它们前 ...
- python猴子选大王_sicily 猴子选大王
题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数 ...
- 猴子选大王C/C++(两种方法)
本关任务:编写一个函数 king,实现猴子选大王的功能. 新猴王的选择方法是:让 N 只候选猴子围成一圈(最多100只猴子),从某位置起顺序编号为 1 ~ N 号.从第1号开始报数,每轮从1报到3,凡 ...
最新文章
- R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、为不同的变量显示不同的统计信息
- 十个用Python实现的简单算法
- 基金委托管理系统试题
- python列表功能默写_Python list(列表)功能详解
- 百度智能云“云+AI”新战略年终答卷,PaddlePaddle累计开发者数量265万人
- Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置	1 1.2. Pub
- 一些压力测试结果(Mysql,Zookeeper,Redis,Mongodb)
- sql服务器的响应时间,如何解决:[Sql Server]超时时间已到。在操作完成之前超时时间已过或服务器未响应。...
- 【谷月老师讲WPS】用 Windows 11 的 WSL 安装 WPS for Linux
- AUTOCAD——坐标标注
- Angularjs的http请求
- StrokeIt 按键列表
- 车载以太网转换器 100/1000BASE-T1 转换器
- 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
- 文化先锋A6客户端自动登陆
- IDEA 导入外来jar包并生效(同 Eclipse 中 buid path 效果)
- Python——format
- 近期中国移动用户无法访问csdn博客
- 通过AI工具(ChatGPT接口)生成一字未改的论文,查重率4.2%,可以直接当作论文使用
- hugetable和mysql区别_BigData-MySQL总结大全(一)苏暖人
热门文章
- 网工扫盲篇:MPLS TE是什么?
- jw player 源码编译运行笔记
- 10-10 查询选修课程超过2门且成绩都在80分以上的学生
- 博图V16之西门子840D sl软件配置
- 市场分析:洞悉客户决策过程
- linuxnbsp;usb
- 击鼓传花java_Java版击鼓传花
- windows虚拟桌面_如何在Windows 10中使用虚拟桌面
- ERROR: Cannot install -r requirements.txt (line 2) and tensorflow>=1.14.0 because these package vers
- marble1.1 编译报KDE 找不到