用循环链表实现:N个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。 无奈,大家只得同意这种办法。于是N个人围成一圈(从1,2,3...N分别编号)。由编号为1的人开始,依次报数,数到第M人,便把他投入大海中, 然后再从他的下一个人数起,数到第M人,再将他扔到大海中,如此循环地进行,直到剩下K个乘客为止。按顺序依次输出被扔下大海的乘客的编号。 输入样例1: 9 3 2 输出样例1: 3 6 9 4 8 5 2 输入样例2: 12 5 6 输出样例2: 5 10 3 9 4 12 |
#include#include using namespace std; typedef struct Node{ int num; Node* next; }Node;//设置节点 int *solve(int N, int M, int K) { Node* L, * p, * r, * q; int Left = N; static int s[1000]; int j = 0; int temp;//数人头 L = new Node; L->next = NULL;//初始化 r = L;//指向尾结点 q = L; *s = NULL; for (int i = 1; i <= N; i++) { p = new Node; p->num = i; p->next = L->next; r->next = p; r = p; }//上船 p = L; while (Left > K) { for (temp=1; temp <= M; temp++) { q = p; p = p->next; if (temp == M) { s[j] = p->num; j++; p = p->next; q->next = p; p = q; } } Left--; } return s; } int main() { int N, M, K; cin >> N >> M >> K; int* s; if (1 <= N && N <= 1000 && 1 <= M && M <= 500000 && 0 <= K && K < N) { s = solve(N, M, K); int i = 0; while (*(s + i)) { cout << *(s + i) << ' '; i++; } } return 0; }



