题目描述:
用循环链表实现:N个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。
无奈,大家只得同意这种办法。于是N个人围成一圈(从1,2,3...N分别编号)。由编号为1的人开始,依次报数,数到第M人,便把他投入大海中,
然后再从他的下一个人数起,数到第M人,再将他扔到大海中,如此循环地进行,直到剩下K个乘客为止。按顺序依次输出被扔下大海的乘客的编号。
提交格式:
实现int * solve(int N,int M,int K)函数。
函数参数为乘客人数N、间隔人数M和剩余乘客人数K,1<=N<=1000,1<=M<=500000,0<=K<N。
函数返回值为按顺序被扔下大海乘客编号的数组。
请不要printf输出任何内容。
输入样例
输入样例1:
9 3 2
输出样例1:
3 6 9 4 8 5 2
输入样例2:
12 5 6
输出样例2:
5 10 3 9 4 12
代码
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct LinkList {
int data;
LinkList* next;
}LNode, * LinkNode;
int* solve(int N, int M, int K) {
static int wo[1001];
int h = N;
LNode* L;
LNode* rop;
LNode* p;
LNode* q;
L = new LNode;
L->data = 1;
L->next = NULL;
rop = L;
*wo = NULL;
for (int j = 0; j < N - 1; j++) {
p = new LNode;
p->data = j + 2;
rop->next = p;
rop = p;
}
rop->next = L;
int i = 0;
if (M == 1) {
while (h > K) {
wo[i] = L->data;
i++;
q = L;
L = L->next;
delete q;
h--;
}
}
else {
while (h > K) {
q = new LNode;
for (int m = 1; m < M - 1; m++) {
L = L->next;
}
wo[i] = L->next->data;
i++;
q = L->next;
L->next = L->next->next;
L = L->next;
delete q;
h--;
}
}
return wo;
}