1. 程式人生 > >2746 約瑟夫問題(單向循環鏈表解法)

2746 約瑟夫問題(單向循環鏈表解法)

刪除 != ast pen 過程 turn style -c log

題目鏈接:
http://bailian.openjudge.cn/practice/2746
描述
約瑟夫問題:有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下一只猴子時,這個猴子就是猴王,編程求輸入n,m後,輸出最後猴王的編號。

輸入
每行是用空格分開的兩個整數,第一個是 n, 第二個是 m ( 0 < m,n <=300)。最後一行是:

0 0

輸出
對於每行輸入數據(最後一行除外),輸出數據也是一行,即最後猴王的編號
樣例輸入
6 2
12 4
8 3
0 0
樣例輸出
5
1
7
 1 /*約瑟夫問題(單向循環鏈表解法) 
2 先創建含有n個猴子結點的單向循環鏈表,然後模擬報數過程,將第m個猴子結點刪除,最後當只有一個猴子結點時跳出循環,輸出結果*/ 3 #include<stdio.h> 4 struct Monkey{ 5 int id; 6 Monkey *next; 7 }; 8 int main(){ 9 int n,m; 10 int i; 11 Monkey *link, *monkey, *lastmonkey; 12 while(scanf("%d%d",&n,&m), n+m != 0){ 13 if
(m==1){//當m為1時直接輸出n 14 printf("%d\n",n); 15 continue; 16 } 17 18 link=lastmonkey=NULL; 19 for(i=1;i<=n;i++){ 20 monkey = new Monkey; 21 monkey->id=i; 22 monkey->next=NULL; 23 if(link == NULL){
24 link = lastmonkey = monkey; 25 } 26 else{ 27 lastmonkey->next=monkey; 28 lastmonkey=monkey; 29 } 30 } 31 /*遍歷 32 monkey=link; 33 while(monkey != NULL){ 34 printf("%d ",monkey->id); 35 monkey= monkey->next; 36 }*/ 37 lastmonkey->next=link;//構成環 38 39 int count=1;//從1開始計數 40 while(link->next != link){ 41 if(count == m-1){ 42 monkey=link->next; 43 link->next=monkey->next; 44 count=0; 45 delete monkey; 46 } 47 link=link->next; 48 count++; 49 } 50 printf("%d\n",link->id); 51 delete link; 52 } 53 return 0; 54 }

2746 約瑟夫問題(單向循環鏈表解法)