课后习题 2-1 约瑟夫问题变形
题目:
设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。请以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。
Josephus.h
#pragma once #include<iostream> using namespace std; class LNode { public: int data; LNode* next; }; class LinkList { private: LNode* first; public: LinkList() { first = new LNode(); first->data = 666; first->next = nullptr; } LinkList(int num) { first = new LNode(); first->data = 666; first->next = nullptr; creat( num); } void creat(int num) { LNode* s; LNode* q; q = first; for (int i = 0; i < num; i++) { s = new LNode(); s->data = i + 1; s->next = q->next; q->next = s; q = s; } q->next = first->next; } void show() { LNode* p = first->next; while (p->next!=first->next) { cout << p->data << " "; p = p->next; } cout << p->data << " "; putchar('\n'); } void Jo(int s, int m,int n) { LNode* p; p = first; for (int i = 0; i < s-1; i++) { p = p->next; } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < m - 1; j++) { p = p->next; } cout << "remove: " << p->next->data << endl; p->next = p->next->next; } cout << "residue: " << p->data << endl; } };
main.cpp
#include"Josephus.h" int main() { LinkList L(9); L.show(); L.Jo(1, 5, 9); return 0; }


浙公网安备 33010602011771号