算法实现——约瑟夫问题
来源:互联网 发布:进化论被推翻 知乎 编辑:程序博客网 时间:2024/05/21 10:27
约瑟夫环问题描述:
约瑟夫环问题起源于一个犹太故事。问题大意如下:
罗马人攻占了乔塔帕特,41个人藏在一个山洞中躲过了这场浩劫。其中包括了Josephus和他的一个朋友。剩余39人不想屈服罗马人,决定集体自杀。大家决定了一个自杀方案,由41个人组成一个圆圈,第一个人开始顺时钟报数,报数为三的人就马上自杀,然后由下一个人重新开始报数,仍然报数为3就自杀。。。。。直到所有人都死亡
输出他们的自杀顺序
思路:循环链表初始化、删除操作
本来以为是很简单的一道题,结果自己写的时候才知道,各种奇葩错误。伤不起啊,重现错误,以及修正过程,以此为鉴。
typedef struct node{int num;node* next;} *pnode;pnode initialize(int n){pnode head = new node;pnode pre=head;//head->next = 0;head->num = n;int i = 1;while (n){pnode p = new node;p->num = i;pre->next = p;pre = p;n--;i++;}pre->next = head->next;return head;}
void yusefu(pnode head){int cnt = 1;int n = head->num;int *no = new int[head->num];pnode p = head->next;pnode pre=p;while (n){while (cnt!=3){//p = pre;pre = p;p = p->next;cnt++;cout << p->num <<"cnt"<<cnt<< endl;}cnt = 0;pre->next = p->next;no[head->num - n] = p->num;n--;delete p;p = pre;}for (int i = 0; i < head->num; i++){cout << no[i] << '\t';if (i == 10)cout << endl;}delete[]no;}int main(){// 约瑟夫环问题:cout << "约瑟夫环问题 input n" << endl;int n;cin >> n;pnode ph=initialize(n);yusefu(ph);}
首先是初始化错误,第一次写的时候没注意,直接把各个node的num值设置成与n相等了,结果就是倒序的;后来调试的时候 解决;
其次函数yuesefu()里面,起初没有第6行,pre=p的赋值,导致编译器警告,后加上;再次运行,因为22行把p delete了,导致进入内层循环的时候,p指针内容无效,错误。自以为是地加上了第12行,以为这样就可以了,没有想到这才是噩梦的开始。
输出的结果怎么都是不对的,各种调试,各种检查,前前后后折腾了一个多小时,最后才恍然大悟,就因为加上了那一行,导致了本质上没有删除链表。最后终于找到原因了,但是不加又会报错,怎么办?终于灵机一动才想起来在23行加上。。。
哎,发现自己还是弱爆了。。。。。
0 0
- 算法实现——约瑟夫问题
- Java实现约瑟夫算法问题
- 约瑟夫问题——算法优化
- 递归算法——约瑟夫问题
- 每天一算法——约瑟夫问题
- 算法总结——约瑟夫问题
- 数据结构与算法——约瑟夫问题
- 约瑟夫环问题——数组实现
- 约瑟夫问题——链表实现
- 约瑟夫问题-O(n)算法实现
- 经典算法<二>约瑟夫问题 C++实现
- 约瑟夫环问题简单算法实现
- 算法第四版约瑟夫问题队列实现
- 数据结构—约瑟夫问题
- 经典算法问题1——约瑟夫环
- 每天一道算法题(23)——约瑟夫环问题
- 《算法》第一章——约瑟夫环(Josephus)问题
- java趣味算法(一)——约瑟夫问题
- 下沙的小面的(2)
- 类族的设计
- spring自带的定时任务功能,基于注解和xml配置
- jquery 1.9 checkbox
- 关于android:src和android:background
- 算法实现——约瑟夫问题
- 软考历程(3)——软件工程
- QT4.8.2在hi3531上的移植
- [转]Android:listView控件,adapter,以及其他控件的组合
- LeetCode_Sort List
- Google is Feeling Lucky(2011上海谷歌杯ACM-ICPC程序大赛G题)
- 2020年苹果或将跌出世界顶级科技公司行列
- openFileOutput()
- 成功人士高效率的工作法