1. 程式人生 > >資料結構程式設計回顧(二)約瑟夫生者死者遊戲

資料結構程式設計回顧(二)約瑟夫生者死者遊戲

題目二:約瑟夫生者死者遊戲
約瑟夫遊戲的大意: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;
}