猴子选大王

  • 前言:初读此题,根据题意,顺势想到了用刚学的数据结构中的循环队列及循环链表,便想借此来熟练一下新学知识。

  • 题目描述:
    一群猴子要选新猴王。新猴王的选择方法是:让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. 猴子选大王--约瑟夫问题浅析

    猴子选大王--约瑟夫问题浅析 猴子选大王问题是一个十分经典的算法问题,这个问题是这样的:一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N ...

  2. 蓝桥杯 - 猴子选大王 (约瑟夫问题)

    标题:猴子选大王 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始 ...

  3. c语言猴子选大王注释,猴子选大王问题(C语言实现)

    题目大概是这样的: n只猴子(n不超过50)围成一个圈.从某一只开始依次给猴子们编号,从1到n.然后从第一只猴子开始,从1开始依次报数,报到m的猴子离开圈子.从这只离开的猴子的下一只开始再从1开始报数 ...

  4. c语言猴子选大王指针,C语言描述怎么用循环队列实现猴子选大王

    匿名用户 1级 2016-12-16 回答 #include #include typedef struct node//定义链表节点类型 { int data; struct node *next; ...

  5. 【PHP版·猴子选大王·约瑟夫环】 一堆猴子都有编号,编号是1,2,3 ...m

    一.问题: n只猴子围坐成一个圈,按顺时针方向从1到n编号. 然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数, 如此重复,直至剩下一个猴子,它就是 ...

  6. java线性表猴子选大王,线性表应用:约瑟夫问题(猴子选大王)(循环链表,数组,递归)...

    1 描述:一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报 ...

  7. 猴子选王c语言链表程序代码,C语言程序设计-猴子选大王[链表应用]

    2032 猴子选大王 Description 有N只猴子,从1~N进行编号.它们按照编号的顺时针方向排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报的第一个数字为1,以后每只猴子报的数字都是它们前 ...

  8. python猴子选大王_sicily 猴子选大王

    题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数 ...

  9. 猴子选大王C/C++(两种方法)

    本关任务:编写一个函数 king,实现猴子选大王的功能. 新猴王的选择方法是:让 N 只候选猴子围成一圈(最多100只猴子),从某位置起顺序编号为 1 ~ N 号.从第1号开始报数,每轮从1报到3,凡 ...

最新文章

  1. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、为不同的变量显示不同的统计信息
  2. 十个用Python实现的简单算法
  3. 基金委托管理系统试题
  4. python列表功能默写_Python list(列表)功能详解
  5. 百度智能云“云+AI”新战略年终答卷,PaddlePaddle累计开发者数量265万人
  6. Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置 1 1.2. Pub
  7. 一些压力测试结果(Mysql,Zookeeper,Redis,Mongodb)
  8. sql服务器的响应时间,如何解决:[Sql Server]超时时间已到。在操作完成之前超时时间已过或服务器未响应。...
  9. 【谷月老师讲WPS】用 Windows 11 的 WSL 安装 WPS for Linux
  10. AUTOCAD——坐标标注
  11. Angularjs的http请求
  12. StrokeIt 按键列表
  13. 车载以太网转换器 100/1000BASE-T1 转换器
  14. 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
  15. 文化先锋A6客户端自动登陆
  16. IDEA 导入外来jar包并生效(同 Eclipse 中 buid path 效果)
  17. Python——format
  18. 近期中国移动用户无法访问csdn博客
  19. 通过AI工具(ChatGPT接口)生成一字未改的论文,查重率4.2%,可以直接当作论文使用
  20. hugetable和mysql区别_BigData-MySQL总结大全(一)苏暖人

热门文章

  1. 网工扫盲篇:MPLS TE是什么?
  2. jw player 源码编译运行笔记
  3. 10-10 查询选修课程超过2门且成绩都在80分以上的学生
  4. 博图V16之西门子840D sl软件配置
  5. 市场分析:洞悉客户决策过程
  6. linuxnbsp;usb
  7. 击鼓传花java_Java版击鼓传花
  8. windows虚拟桌面_如何在Windows 10中使用虚拟桌面
  9. ERROR: Cannot install -r requirements.txt (line 2) and tensorflow>=1.14.0 because these package vers
  10. marble1.1 编译报KDE 找不到