标题

题目描述:

编号为1…N的N个小朋友玩游戏,他们按编号顺时针围成一圈,从第一个人开始按逆时针次序报数,报到第M个人出列;然后再从下个人开始按顺时针次序报数,报到第K个人出列;再从下一个人开始按逆时针次序报数,报到第M个人出列;再从下个人开始按顺时针次序报数,报到第K个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。

输入格式:

输入为3个正整数,分别表示N、M、K,均不超过1000。

输出格式:

输出为一行整数,为出列人的编号。每个整数后一个空格。

样例:

输入样例:
6 3 5
输出样例:
5 3 1 2 4 6

思路:

  约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。“猴子选大王”问题就是经典的约瑟夫问题。度娘详解
  本题目为特殊约瑟夫问题,主要特殊在,每出列一个人后,报数方向逆置。本题在实际实现中就是一个典型的模拟问题。在存储上使用循环双向链表将会更加直观易懂。但是需要注意对在对链表进行操作时,指针的改变需要格外注意。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>using namespace std;struct peo{int num;struct peo *ss;//顺时针 struct peo *ns;//逆时针
};
typedef struct peo* ptrtopeo;
int main(){int n,m,k;scanf("%d%d%d",&n,&m,&k);ptrtopeo head = (ptrtopeo)malloc(sizeof(struct peo));head->num = 1;head->ss = NULL;head->ns = NULL;ptrtopeo tail,ptr;tail = head;int count = 2;while(count <= n){ptr = (ptrtopeo)malloc(sizeof(struct peo));ptr->num = count;ptr->ns = tail;ptr->ss = NULL;tail->ss = ptr;tail = ptr;count++;}
//  printf("-------------------------------1\n");tail->ss = head;head->ns = tail;count = n;ptr = head;ptrtopeo ptr1,ptr2,h;int  p = 1;while(count > 1){while(p < m){ptr = ptr->ns;p++;}printf("%d ",ptr->num);ptr1 = ptr->ns;ptr2 = ptr->ss;ptr1->ss = ptr2;ptr2->ns = ptr1;h = ptr;ptr = ptr->ns;free(h);count--;p = 1;if(count == 1) break;while(p < k){ptr = ptr->ss;p++;}printf("%d ",ptr->num);ptr1 = ptr->ns;ptr2 = ptr->ss;ptr1->ss = ptr2;ptr2->ns = ptr1;h = ptr;ptr = ptr->ss;free(h);count--;p = 1;}printf("%d ",ptr->num);free(ptr);return 0;
}

PTA 特殊约瑟夫问题相关推荐

  1. 循环链表——约瑟夫环

    PTA 7-2 约瑟夫环 (25 分) N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推. 请按退出顺序 ...

  2. PTA 线性表 7-1 约瑟夫环(Josephus)问题(by Yan) (100分) 按出列次序输出每个人的编号

    7-1 约瑟夫环(Josephus)问题(by Yan) (100分) 编号为1,2,-,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数).一开始任选一个正整数m作为报数上限值,从 ...

  3. java约瑟夫环pta上_cdoj525-猴子选大王 (约瑟夫环)

    约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下.(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,-,n依次编号. 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再 ...

  4. PTA猴子选大王(约瑟夫环问题)

    目录 题目 暴力求解 约瑟夫环公式的应用 题目 暴力求解 一开始我每意识到这是一个约瑟夫环问题,于是就想着能不能通过对数组标记的方法暴力求解. 一开始的思路 首先我定义一个数组表示这群猴子,数组的初始 ...

  5. 7-5 模拟报数游戏(约瑟夫环问题):有n个人围成一圈从1开始按顺序编号从第一个人开始从1到k报数,报到k的人退出圈子;然后圈子缩小,下一个人继续,问最后留下的是第几号(只留1 人)。要求定义函数

    学习记录与分享 PTA程序设计类教学平台-Python作业二(循环结构程序设计) 题目 7-5 模拟报数游戏(约瑟夫环问题) 有n个人围成一圈,从1开始按顺序编号,从第一个人开始从1到k报数,报到k的 ...

  6. C语言 之 PTA乙级错误集锦

    1,很大很大的数输入,并各位加和  PTA-1001 #include <stdio.h> #include <math.h> int main(){int sum=0,cou ...

  7. python中约瑟夫环程序_Python实现约瑟夫环问题的方法

    本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...

  8. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  9. 用C++实现约瑟夫环的问题

    约瑟夫问题是个有名的问题:N个人围成一圈.从第一个開始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. 比如N=6,M=5.被杀掉的人的序号为5,4,6.2.3.最后剩下1号. 假定在圈子里前K ...

最新文章

  1. redis php异步队列,基于workerman的redis-queue实现异步邮件队列
  2. sql语句里的limit使用方法
  3. 电脑显示器变色_流光溢彩电竞出击:飞利浦猛腾M1系列电竞显示器275M1RZ
  4. idea中maven的setting.xml的配置
  5. python语言在大数据分析处理领域应用广泛_在大数据分析/挖掘领域,哪些编程语言应用最多...
  6. 1.10.返回四舍五入后的值.round()
  7. HMC支持管理服务器数量及适合POWER6服务器的HMC型号
  8. Flink – SlotSharingGroup
  9. CPU 是如何工作的?
  10. 深入理解前端跨域问题的解决方案——前端面试
  11. Jquery取form表单中的所有参数
  12. 从今天起开始进一步学习前端
  13. 个人博客 修改markdown代码块背景颜色
  14. Go游戏框架初探《一》
  15. Unity2D入门(一):编辑素材、绘制地图
  16. 基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理...
  17. 瞬时日差检定测量仪的使用
  18. python批量查询ip归属地_python查询ip归属地
  19. PostScript(PS 格式)讲解
  20. Linux基操 笔记

热门文章

  1. 超高速相机,在体育赛事中的应用发展
  2. matlab中find函数
  3. zephyr idle thread
  4. 【软考备战·希赛网每日一练】2023年4月26日
  5. java中final是什么意思_java中final、finali、finally三者之间的区别是什么
  6. IIS协议及波形分析
  7. 微软为抢中国市场决定7月起半价销售Office2007
  8. sniffer经典指南 二
  9. window对象的setTimeout、clearTimeout、setInterval、clearInterval方法
  10. 婴儿早教生活的六注意