原题链接:[编程入门]报数问题
解题思路:建立双向循环链表,每个结点保存一个人的序号,当被点到时删除结点并重新连接左右两个结点,直到剩下最后一个结点为止。
注意事项:算法的时间复杂度和空间复杂度很高,很容易超过时间限制。
参考代码:
#include <iostream> using namespace std; typedef struct Lnode { int data; struct Lnode *front, * next; } LNode, * PNode; PNode init(int n); //初始化链表 void flows(PNode p, int m); //运行流程 int main() { int n; cin>>n; PNode L = init(n); flows(L, 3); return 0; } PNode init(int n) { PNode L = new LNode; L->data = 1; PNode p = L; p->next = NULL; p->front = NULL; for(int i = 2; i <= n; ++i) { PNode r = new LNode; r->data = i; p->next = r; r->front = p; p = r; p->next = NULL; } p->next = L; L->front = p; return L; } void flows(PNode p, int m) { while(p->front != p) { for(int i = 1; i < m; ++i) { p = p->next; } p->front->next = p->next; p->next->front = p->front; PNode r = p; p = p->next; delete r; } cout<<p->data; delete p; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复