【数据结构基础】双向约瑟夫问题

来源:互联网 发布:过山车大亨3 for mac 编辑:程序博客网 时间:2024/06/03 14:35

双向约瑟夫问题(15)

成绩15开启时间2017年09月27日 星期三 00:05折扣0.8折扣时间2017年10月20日 星期五 23:55允许迟交否关闭时间2018年01月8日 星期一 23:55

  约瑟夫问题是一个经典的问题,我们不妨将这个经典问题进行扩展,变成一个双向的约瑟夫问题。

  已知 n 个人(不妨分别以编号 1,2,3,...,n 代表 )围坐在一张圆桌周围,首先从编号为 k 的人从 1 开始顺时针报数,1, 2, 3, ...,记下顺时针数到 m 的那个人,同时从编号为 k 的人开始逆时针报数,1, 2, 3, ...,数到 m 后,两个人同时出列。然后从出列的下一个人又从 1 开始继续进行双向报数,数到 m 的那两个人同时出列,...;。依此重复下去,直到圆桌周围的人全部出列。直到圆桌周围只剩一个人为止。

   如果双向报数报到 m 时落在同一个人身上,那本次出列的只有一个人。

  例如:5,1,2。则总共5个人,从1开始顺时针报数,数到2,定位编号2;同时从1开始报数数到2,定位编号5;2和5同时出列。然后继续开始报数,顺时针报数3,4,定位到4;逆时针报数4,3,定位3;4和3同时出列。最后剩余的为编号1。输出为:2-5,4-3,1,。

  如果输入:6,2,3。则输出:4-6,2,1-3,5,。其中第2次只输出一个2,表示第二次双向报数时,恰好都落在编号2上,所以只有一个编号出列。

输入:

n,k,m

输出:

按照出列的顺序依次输出编号。同时出列编号中间用减号"-”连接。

非法输入的对应输出如下

a)

输入:n、k、m任一个为0
输出:n,m,k must bigger than 0.

b)

输入:k>n
输出:k should not bigger than n.

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 1,0,0↵
以文本方式显示
  1. n,m,k must bigger than 0.↵
1秒64M0测试用例 2以文本方式显示
  1. 1,2,1↵
以文本方式显示
  1. k should not bigger than n.↵
1秒64M0测试用例 3以文本方式显示
  1. 5,1,2↵
以文本方式显示
  1. 2-5,4-3,1,↵
1秒64M0测试用例 4以文本方式显示
  1. 6,2,3↵
以文本方式显示
  1. 4-6,2,1-3,5,↵
1秒64M0


双向约瑟夫问题,也是比较经典的题目啦~,就是约瑟夫问题的双向化。自己也用大概和约瑟夫问题大致的思路,写了双向约瑟夫问题,也发现了一些错误,最后修改然后A了题~~

0)定义一个结构体,和约瑟夫问题一致,然后多了一个front构建一个双向的循环链表(因为约瑟夫问题里的链表建立可能写的不太规范。。所以在建立的时候还是先建立单向的循环链表然后再在后面把这个循环链表给反向再连了一次)
1)建立双向循环链表,先建立单项循环链表然后再建立双向的循环链表
2)然后找到第k个
3)【主要部分】从第k个人开始,双向检索,如果是不一样的人,都输出,如果是一个人,只输出他。这里就会出现几个问题。。。就可以分成大概几种情况①、②输出两个人,输出完是(否)结束,③④输出一个人,输出完是(否)结束。
要注意输出完要删除节点,重置timer,还有有就是结束情况。。(我就是没有注意最后输出两个后结束的情况。。然后RE了。。)
然后开始想为什么RE:
1、数组越界
2、内存未分配成功,却使用
3、内存分配成功,但未初始化
4、使用已经释放了的内存
然后发现。。最后输出完没有结束还在跑。。那肯定RE啊喂(#`O′) ,然后就是设置了一个SumCounter,输出几个加上几个。。输完就结束~然后就ok了~~大概如此。。程序写的还是略乱,重复片段有一些。。但是写出来了~记录一下~hhh
#include<stdio.h>#include<stdlib.h>int n,m,k;struct node;typedef struct node *PtrToNode;typedef PtrToNode List,Position;typedef struct node{int element;PtrToNode next;PtrToNode front;};int main(){List head;head=(PtrToNode)malloc(sizeof(struct node));scanf("%d,%d,%d",&n,&k,&m);if(n<1||k<1||m<1){printf("n,m,k must bigger than 0.\n");return 0;}if(k>n){printf("k should not bigger than n.\n");return 0;}int InitialRank=n;head->element=1;head->next=head;head->front=head;while(InitialRank>=2){Position temp;temp=(PtrToNode)malloc(sizeof(struct node));temp->element=InitialRank;InitialRank--;temp->next=head->next;head->next=temp;}//建立初始的顺时针向圈Position p=head,q;while(p->next!=head){q=p->next;q->front=p;p=p->next;} head->front=p;//建立逆时针向圈List P=head;while(1){if(P->element==k){break;}else{P=P->next; }}//找到先排号k的那一个数字List Q=P;int times=1; int DeleteSum=0;while(1){if(m!=times){times++;P=P->next;Q=Q->front;}else {if(P->element==Q->element){   printf("%d",P->element);DeleteSum++;if(DeleteSum==n){printf(",\n");return 0;}else printf(",");P->front->next=P->next;P->next->front=P->front;Q->front->next=Q->next;Q->next->front=Q->front;Position temp3=P->front->next;Position temp4=Q->next->front;free(P);P=temp3;Q=temp4;times=1;}else {printf("%d-%d,",P->element,Q->element);DeleteSum+=2;if(DeleteSum==n){printf("\n");return 0;}P->front->next=P->next;P->next->front=P->front;Q->front->next=Q->next;Q->next->front=Q->front;Position temp1=P->front->next;Position temp2=Q->next->front;free(Q);free(P);P=temp1;Q=temp2;times=1;continue; }}} }




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不小心在微信公众号发了消息怎么办 微信漂流瓶不能用了被投诉了怎么办 货物少了拉货的不承认少了怎么办 寄的快递号码留错了已经寄走怎么办 网购快递放在单位门卫室丢了怎么办 顺丰生鲜速配时效内食物坏了怎么办 竟尤理财跑路怎么办钱追的回来吗 博贝游戏用支付宝提不了现该怎么办 陌陌钱包没绑支付宝就体现了怎么办 鞋子让太阳晒的一只大一只小怎么办 美团不让上饿了么平台们商家怎么办 在汇通信诚租贷款买车被骗后怎么办 我的网银账户里的钱被盗了怎么办 老赖跑到国外去了还换了国籍怎么办 内裤把屁股两边磨得又肿又疼怎么办 京东在面临供货商不供货时怎么办的 打错的消息想撤回但按了删除怎么办 顺丰快递寄的黄皮和荔枝坏了怎么办 我发快递写错地址备签收不还怎么办 新买的床上四件套用着全身痒怎么办 华为畅玩6x锁屏密码忘了怎么办 我在淘宝上买了货不发货咋怎么办 在快递公司寄的东西丢了我该怎么办 不小心给了快递员子一个差评怎么办 不小心用发霉了的杯子喝了水怎么办 唐三复活了小舞失去的魂环怎么办了 我该怎么办?身陷动漫城输了很多钱 庄家开2球大小球踢成2球怎么办 去哪儿网订机票时邮箱写错了怎么办 在南航航班上把手机丢飞机上怎么办 买了品牌鞋穿了一周就破了怎么办 狗让狠狠的打了一顿不理人了怎么办 调好米粉宝宝吃的时候就凉了怎么办 情人间闹分手删了微信后悔了怎么办 8个月宝宝不坐椅子一直要抱怎么办 2个月婴儿3天没有拉大便了怎么办 8个月的宝宝不吃米糊和稀饭怎么办 2岁零5个月的宝宝不说话怎么办 两岁宝宝不拔掉老是拉在裤上怎么办 一岁的宝宝吞了一颗五子棋该怎么办 别人欠我钱还把我拉黑我该怎么办