原题链接:[编程入门]报数问题
解题思路:建立双向循环链表,每个结点保存一个人的序号,当被点到时删除结点并重新连接左右两个结点,直到剩下最后一个结点为止。
注意事项:算法的时间复杂度和空间复杂度很高,很容易超过时间限制。
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复