约瑟夫潜入到一个组织中做卧底,但是最近组织对一批人起了疑心于是让他们站成一个环,每报到7的人将被处死只留下最后一个,为了继续卧底,约瑟夫要如何才能活下去呢?
代码
//提示,开始前先看原理解析食用效果更好
#include<iostream>
using namespace std;
struct Joseph {
int Number;
Joseph *next, *front;
Joseph (){ next = front = 0; }
}n[1001];//用结构体创建节点,next和front分别指向前后节点。
void Cut(Joseph *num){
num = num->front;
num->next = num->next->next;
num = num->next;
num->front = num->front->front;
}//自定义Cut函数,用于删除节点。
int main(){
int tot, outNum=7, nowNum = 1;
Joseph *now = n;
cin >> tot ;
for (int i = 1; i < tot - 1; i++) {
n[i].front = n + i - 1;
n[i].next = n + i + 1;
n[i].Number = i + 1;
}
n[0].front = n + tot - 1;
n[0].next = n + 1;
n[tot - 1].front = n + tot - 2;
n[tot - 1].next = n;
n[0].Number = 1;
n[tot - 1].Number = tot;//初始化整个约瑟夫环。
while (tot >= 1) {//while循环查找应该删除的节点
if (nowNum == outNum) {
cout << now->Number <<endl;
Cut(now);
nowNum = 1;
tot--;
now = now->next;
}
else {
nowNum++;
now = now->next;
}
}
return 0;
}
原理解析
这是一个典型的约瑟夫环问题,在一个环中不停循环7,删除节点直到最后一个。
原理如图所示(画的有点丑)