5.约瑟夫问题(数组法)

另一种解法:将数组全部置1,累计相加到报数,则将该位置置为0,意为该位出列,如此反复。关键在于:把数组作环状处理,这个手法已经演练很多遍了!

/*------------完整代码@映雪-------------*/

#include <iostream>
using namespace std;
int main()
{
    int count=0,s=0,i,j=-1,n=3,m=3;
    int a[100];
    for(i=0;i<n;i++)/*将数组全部置1*/
    a[i]=1;
    while(count<n)
    {
        j=(j+1)%n;
        s=s+a[j];
        if(s==m)/*累加到报数*/
        {
            a[j]=0;/*位置置0,表示出列*/
            s=0;
            count++;/*出列计数+1*/
            printf("%d ",j+1);
        }
    }
    return 0;
}
时间: 2024-12-29 23:45:49

5.约瑟夫问题(数组法)的相关文章

LA3882 约瑟夫数学递归法

首先,约瑟夫环的数学优化方法为: 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):    k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0.现在我们把他们的编号做一下转换: k --> 0 k+1 --

Arduino 数码管LED驱动 数组法

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2368    Accepted Submission(s): 333 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁

点亮流水灯--数组法

/* Main.c file generated by New Project wizard * * Created: 周一 五月 8 2017 * Processor: 80C51 * Compiler: Keil for 8051 */ #include <reg51.h> #include <stdio.h> //延时函数 void delay(){ int i=10000; //用while循环来做兜底循环 while(i--); } //主函数 void main(voi

八连通(vector动态数组法)

题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++.h> using namespace std; int dx[10]={-1,0,1,-1,1,-1,0,1}; int dy[10]={1,1,1,0,0,-1,-1,-1}; int n,m; void dfs(vector< vector < bool > >&a

POJ 3750 小孩报数问题 (线性表思想 约瑟夫问题 数组模拟运算的 没用循环链表,控制好下标的指向就很容易了)

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10423   Accepted: 4824 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小

单链表 /*数组法*/

摘要: 根据树的原理做的一个单链表,这里,把单链表看做[树]的简化版. 在树的递归创建中,首先创建是头结点,所以单链表也是一样: 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建摘要: 根据树的原理做的一个单链表,这里,把单链表看做[树]的简化版. 在树的递归创建中,首先创建是头结点,所以单链表也是一样: 单链表的结构: typedef struct node{ int data; struct n

codevs 4163 求逆序对的数目 -树状数组法

4163 hzwer与逆序对 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description hzwer在研究逆序对. 对于数列{a},如果有序数对(I,j)满足:i<j,a[i]>a[j],则(i,j)是一对逆序对. 给定一个数列{a},求逆序对个数. 输入数据较大,请使用scanf代替cin读入. 输入描述 Input Description 第一行一个数n,表示{a}有n个元素. 接下来n个数,描述{a}. 输出描述 Output D

约瑟夫环——链表法

#include <iostream> #include <stdlib.h> using namespace std; typedef struct node* list; struct node { int Item; list next; }; static void DisplayList(list head) { if (head->next == nullptr) { cout << "null\n"; return; } list

Java学习之约瑟夫环的两中处理方法

1 package day_2; 2 3 import java.util.Scanner; 4 5 /** 6 * @author Administrator 7 * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围坐一圈,约定编号为k(1<=k<=n) 8 * 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次 9 * 类推,直到所有人出列为止,由此产生一个出队编号的序列. 10 * 方法一:数组取模法.(模拟) 11 */ 12 13 p