【数据结构基础】双向约瑟夫问题
来源:互联网 发布:过山车大亨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.
测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1以文本方式显示- 1,0,0↵
以文本方式显示- n,m,k must bigger than 0.↵
1秒64M0测试用例 2以文本方式显示- 1,2,1↵
以文本方式显示- k should not bigger than n.↵
1秒64M0测试用例 3以文本方式显示- 5,1,2↵
以文本方式显示- 2-5,4-3,1,↵
1秒64M0测试用例 4以文本方式显示- 6,2,3↵
以文本方式显示- 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
约瑟夫问题是一个经典的问题,我们不妨将这个经典问题进行扩展,变成一个双向的约瑟夫问题。
已知 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.
- 1,0,0↵
- n,m,k must bigger than 0.↵
- 1,2,1↵
- k should not bigger than n.↵
- 5,1,2↵
- 2-5,4-3,1,↵
- 6,2,3↵
- 4-6,2,1-3,5,↵
1、数组越界
2、内存未分配成功,却使用
3、内存分配成功,但未初始化
4、使用已经释放了的内存
#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; }}} }
阅读全文
0 0
- 【数据结构基础】双向约瑟夫问题
- 数据结构基础之双向链表(约瑟夫问题)
- 【数据结构基础】约瑟夫问题
- 数据结构——双向约瑟夫问题
- 数据结构程序设计--约瑟夫双向生死问题
- 数据结构--双向约瑟夫
- 1. 双向约瑟夫问题
- 双向约瑟夫问题
- 线性表-约瑟夫问题(数据结构基础 第2周)
- 数据结构之约瑟夫问题
- 数据结构-----约瑟夫环问题
- 数据结构:约瑟夫环问题
- [数据结构]约瑟夫环问题
- 数据结构—约瑟夫问题
- [数据结构]约瑟夫问题
- 数据结构 约瑟夫环问题
- 数据结构--约瑟夫问题
- 数据结构--约瑟夫问题
- oracle服务
- 一些函数的简单介绍
- 慕课网 JAVA遇见HTML——Servlet篇 应用mvc架构(Model2)实现
- 二维数组 杨辉三角函数
- RadioGroup的RadioButton简单用法——学习笔记
- 【数据结构基础】双向约瑟夫问题
- SSM整合pom.xml文件
- 求直系亲属关系
- 数据库设计三大范式
- LeetCode简易题解--375
- LeetCode-Merge k Sorted Lists
- CentOS7 安装MySQL
- 简单的使用PHP操作Mysql
- redis实现session共享,实现单点登录