约瑟夫问题
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入样例:18 2
输出样例:5
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct monkey
{
int number;
monkey* next;
monkey* prev;
};
int main()
{
monkey a[302];
int n, m;
cin >> n >> m;
a[1].number = 1;
a[1].next = &(a[2]);
a[1].prev = &(a[n]);
for (int i = 2; i < n; i++)
{
a[i].number = i;
a[i].next = &(a[i + 1]);
a[i].prev = &(a[i - 1]);
}
a[n].number = n;
a[n].next = &(a[1]);
a[n].prev = &(a[n - 1]);
monkey* cur = &(a[1]);
while (n != 1)
{
for (int i = 1; i <= m - 1; i++)
{
cur = cur->next;
}
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
cur = cur->next;
n--;
}
cout << cur->number << endl;
return 0;
}