文章目录

  • 问题描述
  • 输入说明
  • 输出说明
  • 输入范例
  • 输出范例
  • 题目分析
    • 问题重点
    • 思路分析
  • 源码
  • 事故现场
    • 关于走路有点弄混了,分不清步数了
    • 第一次提交
    • 第二次提交
    • 第三次提交
    • 第四次提交
  • 分析与总结
    • 最后

问题描述

圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

输入说明

输入:好人和坏人的人数n(<=32767)、步长m(<=50);

输出说明

输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行。

输入范例

52 6

输出范例

BGGBGBGGBBBBGGGGBBBGBGGBGBBGGBBGBGBBGGGBBBGBGGBBGG
BBGBBGGGGBBBBGGBGGBBGBBGGBGBBGGBBBGGBGGBBGGGBBGBGG
GBGB

题目分析

问题重点
  • 2n个人,n个好人,n个坏人——2n个基本的数据单位,同时有一个属性值
  • 圆桌报数为题——常见的解决办法:取模运算实现圆桌和环形链表
  • 这个先得到结果,在进行输出的题目
思路分析
  • 关于圆桌的实现,虽然不想用循环链表实现,因为太费劲了,但是刚好之前有好几道类似的题目,所以就还是用循环链表,不用数组实现了。
  • 先假设有2n个结点,然后所有的结点的人性值val都为0,被遍历到了就会变成1
  • 遍历够n次退出循环,直接输出
  • 遍历输出控制一下,如果是1,坏蛋,直接输出B;0,好人那就输出G

源码

#include<iostream>using namespace std;template<class ElemType>
struct LinkNode
{ElemType number;ElemType code;LinkNode<ElemType> *next;LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;} //构造函数1,用于构造头结点LinkNode(const ElemType &item1,const ElemType &item2, LinkNode<ElemType> *ptr = NULL) //构造函数2,用于构造其他结点//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面{next = ptr;number = item1;code = item2;}LinkNode(const ElemType &item1, LinkNode<ElemType> *ptr = NULL) //构造函数2,用于构造其他结点//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面{next = ptr;number = item1;}
};//带头结点的循环单链表
template<class ElemType>
class CirLinkList
{private:LinkNode<ElemType> *head;   // 头结点public://无参数的构造函数CirLinkList(){head = new LinkNode<ElemType>;  head->next = head;}//带参数的构造函数CirLinkList(const ElemType &item){head = new LinkNode<ElemType>(item); head->next = head;}//拷贝构造函数CirLinkList(CirLinkList<ElemType> &List);//析构函数~CirLinkList(){ListDestroy();}//销毁链表void ListDestroy();//清空链表void ListClear();//返回链表的长度int ListLength() const;//判断链表是否为空表bool ListEmpty() const;//获取循环链表头结点LinkNode<ElemType>* GetHead() { return head;}//修改链表A的head结点void SetHead(LinkNode<ElemType>*p) { head = p;}//在链表的第pos个位置之后插入e元素bool ListInsert_next(int pos,ElemType e);//表头插入法动态生成链表void CreateList_Head(int n, ElemType *A);//表尾插入法动态生成链表void CreateList_Tail(int n, ElemType *A);//遍历链表bool ListTraverse() const;//在链表的头结点之后插入相关的结点bool InsFirst( ElemType data );//删除对应的结点void deleteNode(LinkNode<ElemType> *p);
};
template<class ElemType>
CirLinkList<ElemType>::CirLinkList(CirLinkList<ElemType> &List)
{LinkNode<ElemType> *temp = List.GetHead()->next;head = new LinkNode<ElemType>(temp);head->next = head;LinkNode<ElemType> *pre = head;temp = temp->next;//insert the node between head and tailwhile(temp == List.GetHead()->next){pre->next = new LinkNode<ElemType>(temp);pre = pre->next;temp = temp->next;}}//销毁链表
template<class ElemType>
void CirLinkList<ElemType>::ListDestroy()
{LinkNode<ElemType> *temp = head;//cout<<"正在调用析构函数"<<endl;while(head) {//cout<<"循环中"<<endl;temp = head->next;head->next = NULL;delete head;head = temp;}}//清空链表
template<class ElemType>
void CirLinkList<ElemType>::ListClear()
{//delete all the nodes apart from the headhead = head->next;LinkNode<ElemType> *pre = head->next;LinkNode<ElemType> *cur = pre->next;head->next = head;while(pre != head->next){delete pre;pre = cur;cur = pre->next;}
}//返回链表的长度
template<class ElemType>
int CirLinkList<ElemType>::ListLength() const
{//the factor of the linklist is represented as the length of the linklistLinkNode<ElemType> *temp = head->next;int length = 0;while(temp != head->next){temp = temp->next;length ++;}return length;
}//判断链表是否为空表
template<class ElemType>
bool CirLinkList<ElemType>::ListEmpty() const
{return head->next == head;
}//在首节点之前插
template<class ElemType>
bool CirLinkList<ElemType>::InsFirst( ElemType data )
{//insert the node at eligible placeLinkNode<ElemType> *temp = head->next,*temp2 = head->next->next;temp->next = new LinkNode<ElemType>(data);temp->next->next = temp2;}//在链表的第pos位置后插入元素e
template<class ElemType>
bool CirLinkList<ElemType>::ListInsert_next(int pos,ElemType e)
{LinkNode<ElemType> *temp = head->next;LinkNode<ElemType> *following = NULL;int counts = 0;while(counts < pos){temp = temp->next;}following = temp->next;temp->next = new LinkNode<ElemType>(e);temp->next->next = following;
}//表头插入法动态生成链表
template<class ElemType>
void CirLinkList<ElemType>::CreateList_Head(int n, ElemType *A)
{int counts = 0;while(counts < n){InsFirst(A[counts]);}}//表尾插入法动态生成链表
template<class ElemType>
void CirLinkList<ElemType>::CreateList_Tail(int n, ElemType *A)
{int counts = 0;//获取头结点LinkNode<ElemType> *temp = head->next;temp->number = -1;//循环插入while(counts < n*2){head->next = new LinkNode<ElemType>(A[counts]);head->next->next = temp;head = head->next;counts ++;}}//遍历链表
template<class ElemType>
bool CirLinkList<ElemType>::ListTraverse() const
{LinkNode<ElemType> *temp = head->next->next;int counts = 1;int badTimes = 0;while(temp != head->next){counts ++;if(temp->number == 0){cout<<"G";}if(temp->number == 1){cout<<"B";badTimes ++;}if(counts == 51){counts = 1;cout<<endl;}temp = temp->next;}//cout<<endl;// cout<<badTimes<<endl;// cout<<endl;
}template<class ElemType>
void Input(CirLinkList<ElemType> &temp,int n)
{int res[n * 2] = {0};temp.CreateList_Tail(n,res);}//删除对应的结点
template<class ElemType>
void CirLinkList<ElemType>::deleteNode(LinkNode<ElemType> *p)
{//find the prior node of the elementLinkNode<ElemType> *temp = head;while(temp->next->number != p->number){temp = temp->next;}//delete the eligible nodetemp->next = temp->next->next;delete p;}template<class ElemType>
void TableGame(CirLinkList<ElemType> &A, int number,int m)
{//delete the head of thelinked listLinkNode<ElemType> *Start = A.GetHead()->next;int times = 0,i = 0;//start the gamewhile(times < number){while(i < m - 1){// cout<<"当前的i"<<i<<endl;// cout<<"当前的值为"<<Start->number<<endl;if(Start->number == 0){i ++;Start = Start->next;}while(Start->number != 0){Start = Start->next;}}Start->number = 1;i = 0;times ++;//   cout<<"times:"<<times<<endl;//    A.ListTraverse();}}int main()
{//获取人数int number;cin>>number;//获取步长int step = 0;cin>>step;CirLinkList<int> A;// cout<<"创建对应的链表"<<endl;Input(A,number);// A.ListTraverse();//开始游戏// cout<<"开始游戏"<<endl;TableGame(A,number,step);// cout<<"开始遍历"<<endl;A.ListTraverse();// cout<<"遍历结束"<<endl;cout<<endl;return 0;
}

事故现场

关于走路有点弄混了,分不清步数了
  • 模式一,往下走,下一步是正确的,才算做一步
  • 没有任何变化
  • 模式二,走对了算作一一步,如果下一步无效,直接跳过,到有效的地方

  • 有变化
第一次提交

  • 这就很神奇,本地一点问题没有,结果oj就有问题
  • 确实有问题,多写一次遍历
第二次提交

  • 魔幻,估计又是输入和输出之间误用空行分割

  • 删掉

第三次提交

  • 你明摆着不让我过的姿态,让我很难受,我买还不行吗?
  • 所以,还是多了一个换行

真的是!!!

第四次提交

分析与总结

  • 关于报数的问题,主要有两种处理方法

    • 删除被报到的结点,那样不用处理无效结点的空转问题
    • 保留被报到的结点,要用不同的标记标记出来,需要处理无效结点的空转问题。
      * 无效结点的空转需要将无效的点直接跳过,直接到下一个有效的点
  • 转轮问题的处理方法:

    • 常规的使用数组,通过对圈子的人数进行取模运算,来实现对应的循环
    • 不长规的,使用的循环链表,注意自己定义数据结构
  • 关于链表的问题:

    • 如果什么都写完了,但是没有运行时间就是慢,大概率是你的析构函数写的有问题
最后

我真想找个一块学习的人,都是DHU的,有没有介绍的,我脱单了,源码都可以给你,扣扣651378276
当然言归正传,我想参加比赛,有意组队的可以找我

圆桌问题(数据结构作业+数组和链表)(1024程序员不容易,这次给源码)相关推荐

  1. 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...

    原标题:为什么程序员一定要学数据结构?数据结构书单推荐~ 来自:程序员书库(ID:OpenSourceTop) 人们最初使用计算机是用来处理简单的数值计算问题,当你使用计算机来处理一个问题时,一般经过 ...

  2. 1024程序员福利日 | 网易云送暖心礼包,只要你是程序员

    有时候,为了彰显重要性,人们会把自己的职业描述得苍翠馥郁,荡气回肠,以使旁人产生一种不知庐山真面目的朦胧之感.比如: 资源管理系统终端信息员: 公司全系统物理安全保障专员: 平面生态理化环境资源整合专 ...

  3. JavaScript实现链表reverseTraversal反向遍历算法(附完整源码)

    JavaScript实现链表reverseTraversal反向遍历算法(附完整源码) reverseTraversal.js完整源代码 reverseTraversal.js完整源代码 functi ...

  4. python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...

  5. 1024程序员日,互联网公司们福利感人;支付宝36万招“找茬”程序员

    10月24日,是程序员日,一大早,"1024程序员节"就上了热搜,网友再次刷起关于程序员的段子来. 为了庆祝程序员日,关爱程序员,许多互联网公司都发了福利. 有的公司准备了快乐(防 ...

  6. SegmentFault 巨献 1024 程序员护卫队#1红岸的呼唤

    文章参考了以下内容: @FIREDOM 博主的博文 SegmentFault 巨献 1024 程序员游戏「红岸的呼唤」第一天任务攻略 http://blog.csdn.net/firedom/arti ...

  7. 1024程序员鼓励师带你嗨!

    1024程序员鼓励师带你嗨!

  8. 1024程序员鼓励节来啦!限量手办、机械键盘、独家PDF下载等多重福利等你来!

    简介:1024程序员节,开发者社区为各位程序员准备了多种活动,精美礼品.技术干货任你挑选! 为庆祝1024程序员的到来,开发者社区为广大开发者准备了限量手办.机械键盘.2021云栖大会演讲精华PDF文 ...

  9. 1024程序员日:有奖答题,全“猿”狂欢!(无套路,100%中奖)

    1024程序员日:有奖答题,全"猿"狂欢! 窗前明月光,疑是影在窗 问君何所在,只为程序忙 身边有这样一个人 作为哥们,你向他借1000块,他会给你1024 还会关心地说一句:拿去 ...

最新文章

  1. html5 css3 设计模式,html5+css3设计模式
  2. php strrchar,php文件上传
  3. Winform中设置ZedGraph鼠标滚轮缩放的灵敏度以及设置滚轮缩放的方式(鼠标焦点为中心还是图形中心点)
  4. python读取raw数据文件_在python下读取并展示raw格式的图片实例
  5. php 结构体_php基础知识集合
  6. TOMCAT 连接池数据库密码加密方法
  7. u检验中的查u界值表_延边双壁波纹管pvc-u
  8. inittab 分析
  9. 理解SpringAOP-菜鸟新手入门
  10. 企业综合安防管理平台
  11. 如何删除难卸载的软件
  12. c语言工具栏运行不见了,电脑下面的任务栏不见了怎么办 几种方法介绍
  13. vscode连接安卓模拟器上autojs
  14. linux查询数据库归档日志,关于 Oracle 归档日志
  15. qt离线下载地址5.14.2
  16. 天津大学matlab软件许可,天津大学《MATLAB基础和应用》课程教学大纲.PDF
  17. 个税不省,何以暴富?程序员汇算清缴注意事项和要点
  18. git pull报错:Your configuration specifies to...from the remote, but no such ref was fetched
  19. java设计模式-观察者模式和中介者模式的异同
  20. Abelssoft SSD Fresh Plus 2021 v10.06.31890 固态硬盘性能优化工具中文版

热门文章

  1. python同时赋值_Python将多个变量赋值为同一个值?列表行为
  2. python实现测试android应用冷启动
  3. 实训一 思科交换机基础配置
  4. 计算机组成原理、微机接口及应用综合实验台
  5. 一位学长的成长经历——[转]我的东软五年
  6. C++图常用库boost graph library
  7. 怎样修复中文版AE套模板时遇到的表达式报错误
  8. hhvm v3.30_HHVM 3.1.0发布
  9. Java实现数组列项相加_数列的考查角度收集整理2[三轮总结]
  10. I - Modulo Permutations (SEERC 2020)