資料結構程式設計回顧(二)約瑟夫生者死者遊戲
阿新 • • 發佈:2018-12-31
題目二:約瑟夫生者死者遊戲
約瑟夫遊戲的大意:30 個遊客同乘一條船,因為嚴重超載,
加上風浪大作,危險萬分。因此船長告訴乘客,只有將全船
一半的旅客投入海中,其餘人才能倖免於難。無奈,大家只
得同意這種辦法,並議定30 個人圍成一圈,由第一個人數
起,依次報數,數到第9 人,便把他投入大海中,然後再從
他的下一個人數起,數到第9 人,再將他投入大海中,如此
迴圈地進行,直到剩下15 個遊客為止。問:哪些位置是將
被扔下大海的位置?
不失一般性,將30 改為一個任意輸入的正整數n,而報數
上限(原為9)也為一個任選的正整數k。
這道理應該是想要用順序表來,由於我比較懶,直接用陣列實現了(畢竟陣列是擴充套件嘛 都一樣 道理懂就行)
假設一共有m個人,每第k個就會被投入大海,最後剩下n個人時停止:
1.建立一個長度為m的陣列people,初始化為0
2.設定變數count 每當遍歷一個活人(people[i]==0),則+1
3.當count%k==0時,即每當數到k時,這個人被投入大海,即置people[i]=1
4.如果訪問遊標i小於總人數,則+1,否則移動到開始,即1,完成迴圈的功能
程式碼如下:
//約瑟夫生死遊戲 #include <stdio.h> #include <string.h> #include <windows.h> int main() { int m;//一共人數 int k;//計數上限 int n;//最後存活人數 int people[99];//總人數 memset(people,0,sizeof(people));//為0 則保留 1 則扔掉 int count=0;//總計數器 int c=0;//目前被扔的人數 int i=1; printf("請輸入總人數:\n"); scanf("%d",&m); printf("請輸入報數上限:\n"); scanf("%d",&k); printf("請輸入最後倖免人數:\n"); scanf("%d",&n); while(1) { if(c==m-n) break; if(people[i]==0) { count++; if(count%k==0) { //被扔的人 people[i]=1; c++; } } if(i<m) i++; else i=1; } printf("以下位置不被扔下大海:"); for(i=1; i<=m; i++) if(people[i]==0) { printf("%d",i); if(i!=m) printf(" "); } return 0; }