约瑟夫生死游戏
- 每30个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将全船一半乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第1个人数起,依次报数,数到第9人,便把他投入大海中,然后再从他的下一个人数起,数到第9人,再将他扔到大海中,如此循环地进行,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。
- 虽然顺序存储可以实现,但过程中涉及删除结点操作,循环链表效率更高,更方便。
顺序实现
#include<iostream>
using namespace std;
int main()
{
int person[30];
int i, j;
for (i = 0; i < 30; ++i) {
person[i] = 0;
}
int count = 0;
j = 0;
while (count < 15) {
i = 0;
while (i < 9) {
if (person[j] == 0) {
++i;
}
j = (j + 1) % 30;
}
--j;
if (j < 0)j = 30 + j;
++count;
person[j] = 1;
cout << j << " ";
j = (j + 1) % 30;
}
system("pause");
return 0;
}
链式实现
#include<iostream>
using namespace std;
typedef struct Node {
int data;
struct Node* next;
}Node,*List;
void initList(List& L);
int main()
{
List L = new Node;
initList(L);
int i,j, count = 0;
Node* p = L;
while (count < 15) {
for (j = 0; j < 7; ++j) {
p = p->next;
}
cout << p->next->data << " ";
Node* q = p->next;
p->next = q->next;
p = p->next;
++count;
}
system("pause");
return 0;
}
void initList(List& L) {
L->data = 0;
L->next = nullptr;
int i;
Node* p = L;
for (i = 1; i < 30; ++i) {
Node* q = new Node;
q->next = nullptr;
q->data = i;
p->next = q;
p = p->next;
}
p->next = L;
}