约瑟夫问题
问题描述
编号为 1-N 的 N 个人围坐在一起形成一个圆圈,从第 P 个人开始,依次按照顺时针的方向报数,数到第 M 个人出列,直到最后剩下一个人。
请写一个程序,对于给定的N,P,M,计算并打印出依次出列的人的编号
#include <iOStream>
using namespace std;
struct Node {
int num;
Node *ahead;
Node *next;
};
Node *Create(int N) { //创建包含N个节点的双向循环链表
int n = 1;
Node *node = new Node;
node->num = n;
Node *head = node; //指向第一个节点
Node *tail = head; //指向最后一个节点
while (n++ < N) {
node = new Node; //建新节点
node->num = n; //赋值
tail->next = node; //接入新节点
node->ahead = tail;
tail = tail->next; //尾巴后移
}
tail->next = head; //尾巴处理
head->ahead = tail;
return head;
}
Node *Search(Node *head, int P) { //从Head开始寻找第P个节点
while (head->num != P) {
head = head->next;
}
return head;
}
Node *Release(Node *head, int M) { //释放Head开始的第N个节点
int count = 1;
Node *temp = head;
while (count < M) { //寻找第M个节点
temp = temp->next;
count++;
}
temp->ahead->next = temp->next; //移除第M个节点
temp->next->ahead = temp->ahead; //移除第M个节点
cout << temp->num << ",";
head = temp->next; //释放第M个节点所占内存空间
delete temp;
return head;
}
int main() {
//约瑟夫问题
int N, P, M = 0; //N-起始节点数,P-开始节点
cin >> N >> P >> M; //每次释放第N个节点
Node *head = Create(N); //创建M个节点的环
head = Search(head, P); //找到第P个节点
while(head->next != head) { //不断释放第M个元素,直到只剩一个元素
head = Release(head, M); //释放第M个节点
}
cout << head->num;
return 0;
}
相关阅读
95后网红徐可:从问题少女到创立ERA 获数百万融资 估值1
摘要:徐可曾是火爆一时的网红。“17岁的海归翻车女”“性感模特”等一系列颇具争议的标签紧贴在她背后。即便
【QT】关于Qt::WA_DeleteOnClose的使用问题
今天在解决软件bug的过程中,注意到QT关于[slot] bool QWidget::close()有这样一段说明: If the widget has the Qt::WA_DeleteOnClo
声明:原文出处:https://blog.csdn.net/xp731574722/article/details/70766804 0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,
淘宝刷收藏加购可以提升宝贝的人气值,提升宝贝综合排名和人气排名,每一个爆款都需要收藏的支持,不过淘宝单纯的刷收藏加购和刷单有点
A5创业网(公众号:iadmin5)7月5日报道,iOS 11.3.1能否越狱?此前外媒曾曝出,由于重新安装问题,Electra iOS 11.3.1越狱工具的发布时间被推