数据结构复习——约瑟夫环
来源:互联网 发布:华为预装软件卸载 编辑:程序博客网 时间:2024/06/05 15:41
求解约瑟夫问题,N个人站成一圈,编号为1~n,数到m出列,然后从下一个人开始重新报数,数到m的出列.
主要思路:
采用一维数组people存放人的编号,先初始化该数组。从编号为1(下标为t=0)的人开始报数,数到m的人(下标t=(t+m-1)%i)出列,输出people[t],并将t后面的元素依次往前移。
#include <iostream>using namespace std;void josephus(int n, int m){ int i = 0, j = 0, t=0, people[50];//最多50个人 for (i; i < n; i++) { people[i] = i + 1;//n个人的初始编号 } cout << "sequence:" << endl; for (i = n; i >=1; i--)//i为数组中的人数 { t = (t + m - 1) % i; //t为出列者的编号 cout << people[t] << " "; for (j = t + 1; j <= i - 1; j++) { people[j - 1] = people[j]; } } cout << endl;}int main(){ int n, m; cout << "输入 n、m" << endl; cin >> n >> m; josephus(n, m); system("pause");}
还可以利用标志数组flag
基本思想就是用一个一维数组去标识这n个人的状态,默认全为1,也就是都在圈子内,当喊道m的人出圈之后,他的标识则变为0(就是出圈了),同时报数器清0,下一个人要从1开始。在每次报数之前要判断他是否在圈子内(也就是他的标识是否为1),如果在圈子里面才会继续报数。定义一个变量记录出圈的人数, 出圈的人数等于 n-1时,则游戏结束。
#include<stdio.h>#define N 1000000int flag[N] = {0};int main(){ int n = 0, m = 0; scanf("%d%d", &n, &m); int i = 0; int count = 0; //记录出圈的人数 int num = 0; //报数器 for(i = 1; i <= n; i++) { flag[i] = 1; } while(count < n - 1) { for(i = 1; i <= n; i++ ) { if (1 == flag[i]) { num++; if(num == m) { printf("%d\n", i); count++; flag[i] = 0; num = 0; } if(count == n - 1) { break; } } } } for(i = 1; i <= n; i++) { if(1 == flag[i]) { printf("The last one is : %d\n", i); } } return 0;}
阅读全文
0 0
- 数据结构复习——约瑟夫环
- (最近复习数据结构)约瑟夫环
- 数据结构复习(重写某些重要数据结构API) ------------约瑟夫环
- 数据结构—约瑟夫问题
- 数据结构—线性表(约瑟夫环)
- 约瑟夫环—数据结构小问题
- 数据结构考研复习--线性表3(约瑟夫环)
- 数据结构复习—栈
- 数据结构复习—队列
- 数据结构:循环单向链表——约瑟夫环
- 计蒜客 数据结构 链表——约瑟夫环 C++
- 头疼的算法与数据结构——约瑟夫环
- 数据结构——练习之约瑟夫环问题
- 数据结构与算法Java版——约瑟夫环问题
- 数据结构练习题 约瑟夫环—用循环链表实现
- 数据结构实验--约瑟夫环
- 数据结构 -- 约瑟夫环
- 数据结构课程设计 约瑟夫环
- HoloToolKit 02-空间音效
- 程序员提高技能
- Javascript刷新页面的几种方法
- ionic2 自定义返回按钮
- Unity将文本复制到剪切板
- 数据结构复习——约瑟夫环
- Linux---守护进程
- sql去掉前后空格
- php cli传递参数的方法
- Tomcat中Context是什么用的
- MySQL索引
- Retrofit+Okhttp+RxJava
- 不可多得的Javascript(AJAX)开发工具 - Aptana
- MySql Workbench 快捷键配置示例(F5执行)