P1996 约瑟夫问题

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N=101;
int n,m;
int ne[N];

int main()
{
    cin>>n>>m;
    if(!n&&!m) return 0;

    for(int i=1;i<n;i++) ne[i]=i+1;
    ne[n]=1;
    int p=1;

    while(p!=ne[p]){
        //i小于等于m-2是因为每次从新开头走到第m数前面只需要这么多步
        for(int i=1;i<=m-2;i++) p=ne[p];
            cout<<ne[p]<<" ";
            ne[p]=ne[ne[p]];
            p=ne[p];
        
    }
    cout<<p;
    return 0;
}
本题是一道很经典的环形矩阵问题,一个更为特殊的点是本题没有用e和ne分别存储值和指针,而是直接用下标代指值,追溯本质就是数组下标的映射问题,一般题目需要下标去共同映射值和指针,而本题下标就是值
posted @ 2025-11-24 19:43  AnoSky  阅读(3)  评论(0)    收藏  举报