hdoj_5643 King's Game(约瑟夫环问题变种)----超时版本(自己模拟的循环链表)

时间:2022-12-16 09:17:16

我很搞笑的用C++写了个C版本的双向循环链表(虽然是超时的,但是很久没有写过链表的,所以试一试)。。。

hdoj_5643 King's Game(约瑟夫环问题变种)----超时版本(自己模拟的循环链表)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;

struct node {
int num;
struct node * pre, * next;
};

struct node * create(struct node * head, int n) {
struct node * p, * q;
for(int i = 1; i <= n; i++) {
q = (struct node *)malloc(sizeof(struct node));
q->num = i;
if(head == NULL) { //head为空 还没有节点。
head = q;
q->next = q;
q->pre = q;
}
else { //p后面加了q
q->next = p->next;
q->pre = p;
p->next->pre = q;
p->next = q;
}
p = q;
}
return p->next; //返回第一个节点
}

struct node * solve(struct node * head, int time) {
struct node * p, * q;
int cnt = 1;
p = q = head->pre;
while(cnt <= time) {
p = p->next;
cnt++;
}
p->next->pre = p->pre;
p->pre->next = p->next;
q = p->next;
free(p);
return q;
}
/*
void Print(struct node * head, int m) {
struct node * p;
for(int i = 1; i <= m; i++) {
p = p->next;
}
}
*/
int main() {
int cas; cin >> cas;
while(cas--) {
int N; cin >> N;
struct node * head = NULL;
head = create(head, N);
for(int i = 1; i < N; i++) head = solve(head, i);
cout << head->num << endl;
}
return 0;
}