题目:

代码1(数组实现):

//
//  main.cpp
//  DS-击鼓传花
//
//  Created by wasdns on 16/11/9.
//  Copyright © 2016年 wasdns. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <string>
using namespace std;int killman[1000];  //killer and alive manint main()
{int n, m;cin >> n >> m;memset(killman, 0, sizeof(killman));int killt = 1;                  //死亡情况,如果killt=总人数,结束游戏killman[1] = -1;                //第一位发言差,根据题目要求首杀int rcd = 1, turn = 1;          //rcd记录存活者,turn为指针int cnt = 0;                    //cnt计数器,一旦为m,杀掉此时指针指向者while (1){if (turn > n) {             //指针越界turn %= n;}if (killman[turn] == -1) {  //此时指向的人已经死亡turn++;continue;}cnt++;                      //指向的人还活着,更新计数器if (cnt == m) {             //计数器计数为m,同时指针指向的人还活着killman[turn] = -1;     //杀死killt++;                //总死亡人数加一rcd = turn;             //rcd记录截止目前最后一位阵亡的同学cnt = 0;                //计数器置0if (killt == n) break;  //游戏结束}turn++;                     //游戏还没有结束,指针后移}cout << rcd << endl;            //最后一位同学假死,存活return 0;
}

结果:

代码2(指针实现):

//
//  main2.cpp
//  DS-击鼓传花
//
//  Created by wasdns on 16/11/9.
//  Copyright © 2016年 wasdns. All rights reserved.
//#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;struct killman {int num;killman *next;
};/*建立循环链表:*/killman* CreatCircle(int n) {killman *k;k = new killman;k -> next = NULL;k -> num = 1;killman *p1, *p2;p1 = p2 = k;for (int i = 2; i <= n; i++){p1 = new killman;p1 -> next = NULL;p1 -> num = i;p2 -> next = p1;p2 = p1;}p1 -> next = k;return k;
}/*根据题目要求,找到开始节点的前一个节点。目的是为了删除第一个节点。*/killman* FindKpre(killman *k)
{killman *p;p = k;while (p -> next != k) {p = p -> next;}return p;
}/*杀人游戏主体:*/int killgame(killman *k, int m)
{int cnt = m;                        //计数器cnt,根据题目要求,初始置mkillman *p1, *p2;                   //p1 为指向当前节点的指针;//p2 为指向前一个节点的指针。p1 = k;p2 = FindKpre(k);                   //找到开始节点的前一个节点,进行删除操作while (1){if (cnt == m) {                 //计数器达到阈值时,删除当前节点p1 = p1 -> next;p2 -> next = p1;cnt = 1;                    //注意:删除之后,本质上进行了前移;//计数器置1.continue;}if (p2 -> next == p2) break;    //当出现回环(loop)的时候://说明只剩下当前节点,游戏结束。cnt++;                          //计数器尚未溢出,指针前移,更新计数器。p2 -> next = p1;p2 = p1;p1 = p1 -> next;}return p1 -> num;                   //返回游戏的赢家
}/*Debug,输出环形链表:*/void KPrint(killman *k) {killman *p;p = k -> next;while (p != k) {cout << "p " << p -> num << endl;p = p -> next;}}int main()
{int n, m;cin >> n >> m;killman *k;k = CreatCircle(n);//KPrint(k);int rcd = 1;rcd = killgame(k, m);cout << rcd << endl;return 0;
}

结果:

小结:

此题是经典的约瑟夫问题,采用ADT表,有两种实现方法:(1)指针实现 (2)数组实现。
需要注意的点是:

  • 题目把第一个人直接出局
  • 计数器和指针更新时的位置(更新指针之后马上更新计数器!)
  • 循环结束条件

可以看到,使用环形链表的性能更优,但是实现相比数组而言更加复杂。

2016/11/9

转载于:https://www.cnblogs.com/qq952693358/p/6049334.html

DS实验题 击鼓传花相关推荐

  1. 击鼓传花c语言编程题,c语言-第5章 循环程序设计.ppt

    <c语言-第5章 循环程序设计.ppt>由会员分享,可在线阅读,更多相关<c语言-第5章 循环程序设计.ppt(83页珍藏版)>请在人人文库网上搜索. 1.第5章 循环程序设计 ...

  2. 用队列解决击鼓传花算法题

    题目: 标号为0~6的6个小朋友围成一圈,开始数数,数到数字5的人自动淘汰,不断循环,剩下的最后一个人胜利. 问:最后胜利的人是谁? 解析: 将这6个学生放入队列中,每个人报一个数的同时出队,并重新进 ...

  3. 击鼓传花击鼓次数相同c语言,击鼓传花

    游戏介绍:这是博客里流行的击鼓传花游戏,传给谁谁就得接着,否则就得挨罚.请认真对待,不要怕暴露隐私. 1.被点到名字的要在自己博客里写下自己的答案,然后去掉第一个问题,再加上一个问题,仍然组成4个问题 ...

  4. 数据结构之 击鼓传花

    2015/10/16/ ///by XBW// //环境  vs2013// 这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题 ...

  5. 58同城19机试题—击鼓传花

    #题目描述 击鼓传花游戏:总共m个人围城一圈,编号从1开始.从第一个人开始传递一朵花,当传到第n次时,持花者出局,下一个人重新计数传递,重复直到所有人都出局.请给出按照原始编号的出剧顺序.例:有7个人 ...

  6. java击鼓传花游戏list_集体互动游戏《击鼓传花游戏》

    一.游戏道具: 鼓或音乐(音响与手机播放).花(可其他物品代替) 二.参加人员: 集体参加 三.游戏规则: 击鼓传花游戏规则都是有哪些?首先大家要围着坐成一圈,本来是要打鼓的可是我们没有鼓,只好就地取 ...

  7. 被邀的击鼓传花游戏, 我点名了哈!

    1)点你的人是: 珊 2)你们的关系是:有缘与我名字同音而认识,能干.聪明.可爱的小女孩 3)你觉得周围的人认为你是个怎样的人: 进取.认真.勤劳.踏实,很有人缘的人. 4)自己喜欢的个性是: 活泼. ...

  8. 击鼓传花:对比 muduo 与 libevent2 的事件处理效率

    前面我们比较了 muduo 和 libevent2 的吞吐量,得到的结论是 muduo 比 libevent2 快 18%.有人会说,libevent2 并不是为高吞吐的应用场景而设计的,这样的比较不 ...

  9. 分享一个有意思题目--击鼓传花

    在看javaScript数据结构与算法这本书时,看到一个挺有意思的题目--击鼓传花 在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人.某一时刻传花停止, 这个时候花在谁手里,谁就退出圆圈结束 ...

最新文章

  1. Python-使用python-memcache操作Memcached
  2. 同一局域网内_Pycharm访问服务器
  3. Python Scrapy 安装及相关配置
  4. Linux_基础_进程管理
  5. php程序员写bug,程序员的修炼-我们为什么会编写BUG
  6. 借力阿里云存储产品 延锋彼欧加速数字化重塑
  7. 1.2 User Interface 规范(系统开发架构与设计步步谈)
  8. abaqus python 建立节点集合_Abaqus中Python通过findAt方法建立region区域
  9. linux运行不了.sh文件,linux下不能执行/bin/sh脚本的原因:command not found
  10. 正则表达式大全(汇总)
  11. C/C++ volatile
  12. svn: E155004 is already locked 解决方案
  13. jdbc连接orcle数据库_java连接Oracle数据库
  14. java程序中oracle回滚,Oracle的DDL语句不能回滚(直接提交)
  15. P2并联cruise混动仿真模型 本模型基于Cruise软件搭建整车模型,基于Matlab/Simulink软件搭建整车控制模块,包括整车模式控制、扭矩分配、能量回收及机械制动等功能模块
  16. 基于matlab的64QAM通信系统的仿真
  17. CPU性能的三大主要参数
  18. 仿苹果 底部弹窗 选择列表
  19. Knowledge graph, Freebase, Wikidata三大知识图谱
  20. PC端实现微信支付功能(Vue2.0)

热门文章

  1. 程序员表白html倒计时,火热的程序员表白方式,调皮弹窗表白代码,赶紧拿去试试吧...
  2. Vue预览PDF,使用vue-pdf,基本使用教程
  3. c# char*字符串指针
  4. 最优停止问题 简单综述 2005年
  5. Merkle Patricia Tree 梅克尔帕特里夏树(MPT)详细介绍
  6. 【马红“名师+”】送教互研共提升 有效课堂我先行(送教送培第二站)
  7. 虚拟机上调整虚拟机的窗口大小
  8. Thress.js设置背景色及背景透明
  9. 2021软考真题答案(系统集成项目管理工程师.上午)
  10. mysql的下载与安装