據說著名猶太歷史學家 josephus有過以下的故事:
在羅馬人占領喬塔帕特後,39個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
小甲魚:理論為什麼能夠付諸實踐?熱心魚油:你***在說啥*&(*%@……!
小甲魚:我的意思是約瑟夫問題跟我們講的迴圈鍊錶有啥關係?
某女魚油:它們都帶套!
小甲魚:真聰明,親乙個^_^
小甲魚:對的,約瑟夫問題裡邊41個人是圍成乙個圓圈,我們的迴圈鍊錶也是乙個圓圈,所以可以模擬並讓計算機執行告訴我們結果!
問題:用迴圈鍊錶模擬約瑟夫問題,把41個人自殺的順序編號輸出。
//n個人圍圈報數,報m出列,最後剩下的是幾號?
#include #include typedef struct node
node;
node *create(int n)
s->next = head->next;
} free(head);
return s->next ;
}int main()
printf("%d->", p->next->data );
temp = p->next ; //刪除第m個節點
p->next = temp->next ;
free(temp);
p = p->next ;
} printf("%d\n", p->data );
return 0;
}
另一種實現:
#include "stdafx.h"
#include #include typedef struct node
node;
void initlist(int num,node **phead)
}void printnum(node* phead)
phead=p1;
printf("\n活下來的人:%d,%d\n",phead->m_num,phead->next->m_num);
}int _tmain(int argc, _tchar* argv)
編號為1~n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數,可以自由輸入),開始人選乙個正整數作為報數上限值m,從第乙個人按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始從1報數,如此下去,直至所有人全部出列為止。
#include #include #define max_node_num 100
#define true 1u
#define false 0u
typedef struct nodetype
nodetype;
/* 建立單向迴圈鍊錶 */
static void crealist(nodetype **, const int);
/* 執行"約瑟夫環"問題 */
static void statgame(nodetype **, int);
/* 列印迴圈鍊錶 */
static void prntlist(const nodetype *);
/* 得到乙個結點 */
static nodetype *getnode(const int, const int);
/* 測試鍊錶是否為空, 空為true,非空為false */
static unsigned emptylist(const nodetype *);
int main(void)
else
break;
}crealist(&phead, n);
printf("\n------------ 迴圈鍊錶原始列印 -------------\n");
prntlist(phead);
printf("\n-------------刪除出隊情況列印 -------------\n");
statgame(&phead, m);
}static void crealist(nodetype **pphead, const int n)
else
}printf("完成單向迴圈鍊錶的建立!\n");
}static void statgame(nodetype **pphead, int icipher)
if (pprv == pcur)
iflag = 0;
pdel = pcur; /* 刪除pcur指向的結點,即有人出列 */
pprv->next = pcur->next;
pcur = pcur->next;
icipher = pdel->cipher;
printf("第%d個人出列, 密碼: %d\n", pdel->id, pdel->cipher);
free(pdel);
}*pphead = null;
getchar();
}static void prntlist(const nodetype *phead)
while (pcur != phead);
getchar();
}static nodetype *getnode(const int iid, const int icipher)
pnew->id = iid;
pnew->cipher = icipher;
pnew->next = null;
return pnew;
}static unsigned emptylist(const nodetype *phead)
return false;
}
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...