1. 程式人生 > >使用連結串列解決約瑟夫環問題

使用連結串列解決約瑟夫環問題

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;
}