数据结构复习 约瑟夫问题(模拟及队列解法)

题目

约瑟夫问题是一个经典的问题,题目详情如下

n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

洛谷传送门

解法1

这道题很容易想到模拟的方法,(当初学习C语言的时候也是采用的模拟,只不过写了很久...实在是太菜了)

标记好每个人是否被killed即可

以下是用java实现的代码

Josephus.java


import java.util.Scanner;

public class Josephus {
    public static void main(String []args){
        int numOfPersons,toKill,leftPersons;
        Scanner scanner = new Scanner(System.in);
        numOfPersons = scanner.nextInt();
        leftPersons=numOfPersons;
        toKill = scanner.nextInt();
        Person [] persons = new Person[numOfPersons+1];
        for(int i=1;i<=numOfPersons;i++){
            persons[i] = new Person(i,false);
        }
        int j=1;//j 计 编号
        int k=1;//k 计 toKill循环
        System.out.print("Kill ");
        while (leftPersons>1){
            if(k==toKill&&!persons[j].getKilled()){
                persons[j].setKilled(true);
                leftPersons--;
                k=0;
                System.out.print(j+" ");
            }
            k++;
            j++;
            if(j>numOfPersons)
                j=1;
            while (persons[j].getKilled()){ //已经死了的人“报数”
                j++;
                if(j>numOfPersons)
                    j=1;
            }

        }
        for(int i=1;i<=numOfPersons;i++)
        {
            if(!persons[i].getKilled())
                System.out.println("\n"+"最后存活下来的人是 " + i);
//                System.out.println(i);
        }
    }

}

Person.java

public class Person {
    private int num;
    private boolean isKilled;
    Person(int num,boolean isKilled){
        this.num= num;
        setKilled(isKilled);
    }
    public void setKilled(boolean killed) {
        isKilled = killed;
    }
    public boolean getKilled(){
        return isKilled;
    }
}

解法2

实际上这道题更优美的解法是采用队列

判断每个人是否轮到被kill,如果不是则将其放回队尾

以下是Cpp实现的代码(同时也在洛谷AC)

#include 
#include 
using namespace std;
queue persons;
int main() {
    int n,m;
    cin>>n>>m;
    int numNow=1;
    for(int i=1;i<=n;i++)
        persons.push(i);
    while (!persons.empty()){
        if(numNow==m){
            numNow=1;
            cout<

 

你可能感兴趣的:(数据结构复习,线性表)