約瑟夫環(使用C語言單向迴圈連結串列來解決)
阿新 • • 發佈:2018-12-08
題目描述
編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一
開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那
個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,數到m的那個人又出列;如
此下去,直至圓桌周圍的人全部出列為止。要求按出列順序輸出n個人的編號。
輸入
第一行輸入兩個整數,依次表示人數n和初始化密碼m,以空格間隔。
第二行依次輸入n個整數,分別表示n個人的密碼,以空格間隔。
輸出
按出列次序輸出每個人的編號,以空格間隔。
樣例輸入
7 20
3 1 7 2 4 8 4
樣例輸出
6 1 4 7 2 3 5
AC程式碼
#ifndef LIST_H
#define LIST_H
typedef struct node {
int xuhao;
int password;
struct node * next;
}Node, *List;
#endif
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main(void)
{
List head = (List)malloc(sizeof(Node));
head->next = head;
List prev = head;
//定義總人數與初始密碼
int numbers, firstPassword;
//臨時數字
int password;
scanf("%d%d", &numbers, &firstPassword);
for (int i = 1; i <= numbers; i++) {
scanf("%d", &password);
List pnew = (List)malloc(sizeof(Node));
prev->next = pnew;
pnew->xuhao = i;
pnew->password = password;
pnew->next = head;
prev = pnew;
}
List p = head->next;
prev = head;
while (head->next != head) {
if (firstPassword != 0) {
password = firstPassword;
firstPassword = 0;
}
for (int i = 0; i < password - 1; i++) {
if (p->next == head) {
p = p->next;
prev = prev->next;
}
p = p->next;
prev = prev->next;
}
if (p->next == head) {
List t = p;
password = p->next->password;
printf("%d ", p->xuhao);
prev->next = head;
prev = head;
p = head->next;
free(t);
}
else {
password = p->password;
printf("%d ", p->xuhao);
prev->next = p->next;
List t = p;
p = p->next;
free(t);
}
}
printf("\n");
return 0;
}