题意:给n个人从1编号到n,先从左往右数m1个人出队,然后从右往左数m2个人出队,问剩下最后一个人的编号。
题解:双向约瑟夫水题,双向链表解决。
#include <stdio.h>
#include <string.h>
const int N = 10000;
struct List {
int v;
List *next;
List *front;
}l[N];
int main() {
int n, m1, m2;
scanf("%d%d%d", &n, &m1, &m2);
List * head = &l[1];
for (int i = 1; i <= n; i++) {
l[i].v = i;
if (i == 1) {
l[i].front = &l[n];
l[i].next = &l[i + 1];
continue;
}
else if (i == n) {
l[i].front = &l[i - 1];
l[i].next = &l[1];
continue;
}
l[i].next = &l[i + 1];
l[i].front = &l[i - 1];
}
List *pre = head;
int a;
while (1) {
a = 1;
while (a != m1) {
a++;
pre = pre -> next;
}
if (pre -> next != pre) {
pre -> next -> front = pre -> front;
pre -> front -> next = pre -> next;
pre = pre -> front;
}
else {
printf("%d\n", pre -> v);
break;
}
a = 1;
while (a != m2) {
a++;
pre = pre -> front;
}
if (pre -> next != pre) {
pre -> next -> front = pre -> front;
pre -> front -> next = pre -> next;
pre = pre -> next;
}
else {
printf("%d\n", pre -> v);
break;
}
}
return 0;
}