圆桌问题(数据结构作业+数组和链表)(1024程序员不容易,这次给源码)
文章目录
- 问题描述
- 输入说明
- 输出说明
- 输入范例
- 输出范例
- 题目分析
- 问题重点
- 思路分析
- 源码
- 事故现场
- 关于走路有点弄混了,分不清步数了
- 第一次提交
- 第二次提交
- 第三次提交
- 第四次提交
- 分析与总结
- 最后
问题描述
圆桌上围坐着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程序员不容易,这次给源码)相关推荐
- 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...
原标题:为什么程序员一定要学数据结构?数据结构书单推荐~ 来自:程序员书库(ID:OpenSourceTop) 人们最初使用计算机是用来处理简单的数值计算问题,当你使用计算机来处理一个问题时,一般经过 ...
- 1024程序员福利日 | 网易云送暖心礼包,只要你是程序员
有时候,为了彰显重要性,人们会把自己的职业描述得苍翠馥郁,荡气回肠,以使旁人产生一种不知庐山真面目的朦胧之感.比如: 资源管理系统终端信息员: 公司全系统物理安全保障专员: 平面生态理化环境资源整合专 ...
- JavaScript实现链表reverseTraversal反向遍历算法(附完整源码)
JavaScript实现链表reverseTraversal反向遍历算法(附完整源码) reverseTraversal.js完整源代码 reverseTraversal.js完整源代码 functi ...
- python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...
一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...
- 1024程序员日,互联网公司们福利感人;支付宝36万招“找茬”程序员
10月24日,是程序员日,一大早,"1024程序员节"就上了热搜,网友再次刷起关于程序员的段子来. 为了庆祝程序员日,关爱程序员,许多互联网公司都发了福利. 有的公司准备了快乐(防 ...
- SegmentFault 巨献 1024 程序员护卫队#1红岸的呼唤
文章参考了以下内容: @FIREDOM 博主的博文 SegmentFault 巨献 1024 程序员游戏「红岸的呼唤」第一天任务攻略 http://blog.csdn.net/firedom/arti ...
- 1024程序员鼓励师带你嗨!
1024程序员鼓励师带你嗨!
- 1024程序员鼓励节来啦!限量手办、机械键盘、独家PDF下载等多重福利等你来!
简介:1024程序员节,开发者社区为各位程序员准备了多种活动,精美礼品.技术干货任你挑选! 为庆祝1024程序员的到来,开发者社区为广大开发者准备了限量手办.机械键盘.2021云栖大会演讲精华PDF文 ...
- 1024程序员日:有奖答题,全“猿”狂欢!(无套路,100%中奖)
1024程序员日:有奖答题,全"猿"狂欢! 窗前明月光,疑是影在窗 问君何所在,只为程序忙 身边有这样一个人 作为哥们,你向他借1000块,他会给你1024 还会关心地说一句:拿去 ...
最新文章
- html5 css3 设计模式,html5+css3设计模式
- php strrchar,php文件上传
- Winform中设置ZedGraph鼠标滚轮缩放的灵敏度以及设置滚轮缩放的方式(鼠标焦点为中心还是图形中心点)
- python读取raw数据文件_在python下读取并展示raw格式的图片实例
- php 结构体_php基础知识集合
- TOMCAT 连接池数据库密码加密方法
- u检验中的查u界值表_延边双壁波纹管pvc-u
- inittab 分析
- 理解SpringAOP-菜鸟新手入门
- 企业综合安防管理平台
- 如何删除难卸载的软件
- c语言工具栏运行不见了,电脑下面的任务栏不见了怎么办 几种方法介绍
- vscode连接安卓模拟器上autojs
- linux查询数据库归档日志,关于 Oracle 归档日志
- qt离线下载地址5.14.2
- 天津大学matlab软件许可,天津大学《MATLAB基础和应用》课程教学大纲.PDF
- 个税不省,何以暴富?程序员汇算清缴注意事项和要点
- git pull报错:Your configuration specifies to...from the remote, but no such ref was fetched
- java设计模式-观察者模式和中介者模式的异同
- Abelssoft SSD Fresh Plus 2021 v10.06.31890 固态硬盘性能优化工具中文版
热门文章
- python同时赋值_Python将多个变量赋值为同一个值?列表行为
- python实现测试android应用冷启动
- 实训一 思科交换机基础配置
- 计算机组成原理、微机接口及应用综合实验台
- 一位学长的成长经历——[转]我的东软五年
- C++图常用库boost graph library
- 怎样修复中文版AE套模板时遇到的表达式报错误
- hhvm v3.30_HHVM 3.1.0发布
- Java实现数组列项相加_数列的考查角度收集整理2[三轮总结]
- I - Modulo Permutations (SEERC 2020)