问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
这是写的一种解法,后续可能还会研究一下其他解法,写了再发。
// joesphus.cpp : 约瑟夫问题程序解法。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
//定义节点
class Node
{
public:
int data;
Node *next;
};
//定义自杀类
class kill
{
public:
kill();
~kill();
void printfSequecnceOfKiller();
private:
Node *head;
};
//构造函数,初始化41个人的顺序
kill::kill()
{
//不设置头结点,直接是第一个节点
head = new Node();
head->data = 1;
head->next = head;
Node *p,*q;
p = head;
for (int i = 2; i <= 41; i++)
{
q = (Node*)malloc(sizeof(Node));
q->data = i;
q->next = p->next;
p->next = q;
p = q;
}
p = head;
printf("******************初始化人员顺序******************\n");
while (p->next!=head)
{
printf("%d->", p->data);
p = p->next;
}
printf("%d\n", p->data);
}
kill::~kill()
{
delete head;
printf("\n******************析构函数******************\n");
}
//计算自杀的顺序,并打印
void kill::printfSequecnceOfKiller()
{
printf("******************打印自杀顺序******************\n");
Node *p;
p = head;
int n = 1;
while (p->next->next!=p)
{
n++;
//判断下一个节点是否是排序到3
if (n%3==0)
{
printf("%d->", p->next->data);
p->next = p->next->next;
n = 1;//此处每删除一个节点,就需要重新排号
}
p = p->next;
}
printf("%d->", p->data);
printf("%d", p->next->data);
}
int main()
{
kill surcide;
surcide.printfSequecnceOfKiller();
return 0;
}