最新文章

这里会显示最新的几篇文章摘要。

约瑟夫问题(单链)

P1996 约瑟夫问题

题目描述

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

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 \(n-1\) 名小朋友,而该题是全部出圈。

输入格式

输入两个整数 \(n,m\)

输出格式

输出一行 \(n\) 个整数,按顺序输出每个出圈人的编号。

输入输出样例 #1

输入 #1

10 3

输出 #1

3 6 9 2 7 1 8 5 10 4

说明/提示

\(1 \le m, n \le 100\)

直接看代码

相当于环状链,逐步取出节点的过程,这篇写得详细约瑟夫问题


#include<iostream>
#include<cstring>
using namespace std;

const int N = 200;
int p[N],ne[N];

int main() {
    int n, m;
    cin >> n >> m;
    for(int i = 0;i < n;++i) ne[i] = i + 1;  //留着0,这样输出的时候至少有两个节点,k
    ne[n] = 1;
    int p = 0;
    for(int i = 1;i <= n;++i) {
        for(int j = 1;j < m;++j)
            p = ne[p];
        cout << ne[p] <<' ';   //到m-1的位置,方便输出下一位
        int t = p;              // 
        p = ne[p];              //
        ne[t] = ne[ne[t]];      //这里删除m位节点,并且p指向被删除节点,因为,从0位移动m-1次才到m-1位
        

    }


    return 0;
}
posted @ 2025-02-26 18:25  bakul  阅读(22)  评论(0)    收藏  举报