用順序表解決約瑟夫環問題


一、實驗題目:約瑟夫環問題:設編號為1,2,3,……,n的n(n>0)個人按順時針方向圍坐一圈,m為任意一個正整數。從第一個人開始順時針方向自1起順序報數,報到m時停止並且報m的人出列,再從他的下一個人開始重新從1報數,報到m時停止並且報m的人出列。如此下去,直到所有人全部出列為止。要求設計一個程序模擬此過程,對任意給定的m和n,求出出列編號序列。實驗要求:用順序表實現。
二、設計分析:
首先創建了一個順序表,並且用數組存每個人的編號,出列的時候將此編號置為0,代表此位置的人已經出列,循環查詢編號不為0的元素,並用變量j記下當前是第幾個人,當j==m的時候,代表此位置是第m個人,輸出並將編號置為0,用k記錄出列人的下一位的索引,並將數組長度-1,再進行新一輪的循環,直到所有人都出列。
三、程序代碼:

#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=100;
typedef struct Node{
	int data[MaxSize];
	int length;
}List;
void CreateList(List *&L,int n){
	L=(List *)malloc(sizeof(List*));
	for(int i=1;i<=n;i++){
		L->data[i]=i;
	}
	L->length=n;
}
void DispList(List *&L,int m){
	int len=L->length;
	int j=0,k=1;
	while(L->length){
		 for(int i=1;i<=len;i++){
		 	if(L->data[k]){
		 		j++;
			}
			if(j==m){
				cout<<L->data[k]<<" ";
				L->data[k]=0;
				L->length--;
				j=0;
				k=(k+1)%(len+1)?(k+1)%(len+1):1;
				break;
			}
			k=(k+1)%(len+1)?(k+1)%(len+1):1;
		 }
	}
	
}
int main(){
	int m,n;
	cin>>m>>n;
	List *L;
	CreateList(L,n);
	DispList(L,m);
        return 0;
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM