循环队列解决约瑟夫问题
生活随笔
收集整理的這篇文章主要介紹了
循环队列解决约瑟夫问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有n個(gè)人圍成一圈,從第1個(gè)人開(kāi)始,1,2,…,m報(bào)數(shù),報(bào)至m出局,余下的人繼續(xù)從1,2,…,m報(bào)數(shù),重復(fù)之前的流程,要求:求出被淘汰編號(hào)的序列,及最后剩下的一人是
原來(lái)的第幾號(hào)?(要求:用循環(huán)隊(duì)列解決該問(wèn)題。)
?
#ifndef STATUS_H #define STATUS_H#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status;#endif?
#include <iostream> using namespace std; #include "Status.h" typedef int ElemType; typedef struct { ElemType *base; int front; int rear; int MAXSIZE; }SqQueue; Status InitQueue(SqQueue& Q,int n) //初始化隊(duì)列 { Q.base = new ElemType[100]; if(!Q.base) { cout << "創(chuàng)建隊(duì)列失敗!"; return ERROR; } Q.front=Q.rear=0; Q.MAXSIZE = n+1;//MAXSIZE是總?cè)藬?shù)+1,是為了留出一個(gè)空位置來(lái)放置rear return OK; } void QueueTraverse(SqQueue Q) //遍歷隊(duì)列 { int i; i=Q.front; while(i!=Q.rear) { cout<<Q.base[i]<<" "; i=(i+1)%Q.MAXSIZE; } cout<<endl; } Status EnQueue(SqQueue& Q,ElemType e) //入隊(duì) { if((Q.rear+1)%Q.MAXSIZE==Q.front) { cout << "隊(duì)列已滿!"; return ERROR; } Q.base[Q.rear] = e; Q.rear = (Q.rear+1)%Q.MAXSIZE; return OK; } Status DeQueue(SqQueue& Q,ElemType& e) //出隊(duì) { if(Q.front==Q.rear) { cout << "隊(duì)列為空!"; return ERROR; } e = Q.base[Q.front]; Q.base[Q.front] = 0; Q.front = (Q.front+1)%(Q.MAXSIZE-1);//總?cè)藬?shù)為MAXSIZE-1return OK; }int main() { int n,m,i=1; SqQueue Q; ElemType e; cout << "請(qǐng)輸入n個(gè)人(n<=100):";do{ cin >> n; if(n>100 || n<1) { cout << "輸入人數(shù)錯(cuò)誤!請(qǐng)重新輸入:"; } }while(n>100 || n<1);InitQueue(Q,n); while(i<=n)//入隊(duì)操作 { EnQueue(Q,i); i++; } cout << "\n此時(shí)的序列順序?yàn)?#xff1a;"<<endl; QueueTraverse(Q); cout << "\n請(qǐng)輸入第m個(gè)人出隊(duì)(1<=m<=n):"; do{ cin >> m; if(m>n || m<1) { cout << "m輸入錯(cuò)誤!請(qǐng)重新輸入:"; }}while(m>n || m<1);cout << endl; int Count = n;//用來(lái)記錄剩下的人數(shù) while(Count != 1) { i = 1;//i用來(lái)控制是第幾個(gè)人報(bào)數(shù) while(i != m)//當(dāng)i的值不等于m的值時(shí) { Q.front = (Q.front+1)%(Q.MAXSIZE-1);//總?cè)藬?shù)為MAXSIZE-1 if(Q.base[Q.front] != 0)//當(dāng)此時(shí)不為0的話,i++用來(lái)控制第幾個(gè)人 { i++; } } DeQueue(Q,e); while(Q.base[Q.front] == 0)//當(dāng)此時(shí)為0的時(shí)候,循環(huán)找到下一個(gè)不為0的位置 { Q.front = (Q.front+1)%(Q.MAXSIZE-1); } cout << "序號(hào):" << e << "出局!\n"; Count--; } DeQueue(Q,e); cout << "\n最后一個(gè)是:" << e << endl; return 0; }?
?
1.? 有n個(gè)人圍成一圈,從第1個(gè)人開(kāi)始,1,2,…,m報(bào)數(shù),報(bào)至m出局,余下的人繼續(xù)從1,2,…,m報(bào)數(shù),重復(fù)之前的流程,要求:求出被淘汰編號(hào)的序列,及最后剩下的一人是原來(lái)的第幾號(hào)?(要求:用循環(huán)隊(duì)列解決該問(wèn)題。)
轉(zhuǎn)載于:https://www.cnblogs.com/luoyanghao/p/6197664.html
總結(jié)
以上是生活随笔為你收集整理的循环队列解决约瑟夫问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Bootsrap基本应用
- 下一篇: 爱的世界很拥挤,写在读《爱,就这么简单》