使用連結串列解決約瑟夫環問題
阿新 • • 發佈:2019-01-31
1139 約瑟夫環問題
時間限制:500MS 記憶體限制:65536K
提交次數:157 通過次數:79
題型: 程式設計題 語言: G++;GCC
Description
約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次給每個小孩編上號碼。老師指定從第s位小孩起從1開始報數,
當數到m時,對應的小孩出列,依次重複,問最後留下的小孩是第幾個小孩?例如:總共有6個小孩,圍成一圈,從第一個小孩開始,
每次數2個小孩,則遊戲情況如下:
小孩序號:1,2,3,4,5,6
離開小孩序號依次為:2,4,6,3,1
最後獲勝小孩序號:5
輸入格式
每組輸入是三個整數n,s,m。(1 <= n <= 30, 1 <= s <= n,1 <= m <= 10) ;
輸出格式
對於每組輸入,請輸出最後留下小孩的序號。
輸入樣例
6 1 2
輸出樣例
5
`
#include <stdio.h> #include <malloc.h> #define ren sizeof(struct people) int yz, xx, ny; struct people { int r; int num; struct people *next; }; struct people *create(int n) { struct people *head = NULL,*p1=NULL, *p2 = NULL; int i; for (i = 1; i <= n; i++) { p1 = (struct people *)malloc(ren); p1->r = 1; p1->num = i; p1->next = NULL; if (i == 1)head = p1; else p2->next = p1; p2 = p1; } p1->next = head; return(head); } int main(){ struct people *head; int n, s,l,k = 0, m; scanf_s("%d %d %d", &n,&s,&l); head = create(n); struct people *p; p = head; while (p->num != s) { p = p->next; } m = 1; while (k < n - 1) { while(m<l){ if (p->r == 1) { m++; } p = p->next; } while (p->r != 1) { p = p->next; } p->r = 0; k++; m = 1; } p = head; while (p->r !=1) { p = p->next; } printf("%d", p->num); return 0; }