zoukankan      html  css  js  c++  java
  • 数据结构—约瑟夫环

    约瑟夫环

    是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

    约瑟夫环运作如下:

    1、一群人围在一起坐成环状(如:N)
    2、从某个编号开始报数(如:K)
    3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
    4、一直循环,直到所有人出列,约瑟夫环结束

    代码实现 :

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef struct node{
    	int date;
    	bool flag;
    	struct node* nxt;
    }node,*linklist;
    
    void slove(int n,int m,int k) {
    	
    	linklist s ,tmp ;
    	tmp = new node;
    	tmp->date = 1; tmp->flag = false;
    	tmp->nxt = tmp; s = tmp;
    	for (int i = 2 ; i <= n ; i++ ) {
    		tmp = new node;
    		tmp->date = i; tmp->flag = false;
    		tmp->nxt = s->nxt; s->nxt = tmp;
    		s = tmp;
    	} s = s->nxt;
    	
    	for (int i = 1;i<=n;i++) {
    		if ( s->date == k ) break;
    		s = s->nxt;
    	}
    	queue<int>que;
    	int cnt = 0 ,count = 0;
    	while( cnt < n ) {
    		if ( !s->flag ) {
    			count++;
    			if ( count % m == 0 ) {
    				cnt++; s->flag =true;
    				que.push(s->date);
    			}
    		}
    		s = s->nxt;
    		
    	}
    	printf("The ans is :");
    	while(!que.empty()) {
    		printf("%d ",que.front()); que.pop();
    	} puts("");
    }
    
    int main() {
    	
    	int n ,m ,k ,choose;
    	while( 1 ) {
    		printf("请输入 人数--倍数--开始的位置(空格隔开) :
    ");
    		cin >> n >> m >> k; 
    		slove(n ,m ,k );
    		printf("您还需要继续吗(1.继续,0.停止):
    ");
    		cin >> choose;
    		if(!choose) break;
    	}
    	return 0;
    }
    
  • 相关阅读:
    MySQL中查询表及索引大小的方法
    转:一套大而全的系统架构体系与具体落地方案
    [转]1年时间业务量疯长40倍,谈人人车的平台架构演进之路
    [转]如何实现“持续集成”?闲鱼把研发效率翻了个翻
    微服务介绍
    Python2.X和Python3.X的w7同时安装使用
    黑客与画家阅读体会
    Open Source 开发工具集
    volatile和不加volatile的区别
    VMware改变硬盘空间大小的方法
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745928.html
Copyright © 2011-2022 走看看