P1996 约瑟夫问题

方法:循环链表

#include<iostream>
using namespace std;

const int N = 110;

int h, e[N], ne[N], idx;
int n, m;

void init(){
    h = -1;
    for(int i = n; i >= 1; i --){
        e[idx] = i;
        ne[idx] = h;
        h = idx ++;
    }
    
    ne[0] = h;
}

void del(int x){
    ne[x] = ne[ne[x]];
}

int main(){
    cin >> n >> m;
    
    init();
    
    int cnt = 1, p = h, q = 0;
    
    while(ne[p] != p){
        if(cnt == m){
            cout << e[p] << ' ';
            del(q);
            p = ne[q];
            cnt = 1;
            continue;
        }
        cnt ++;
        q = p;
        p = ne[p];
    }
    
    cout << e[p];
    
    return 0;
}
posted @ 2020-10-20 19:35  yys_c  阅读(67)  评论(0编辑  收藏  举报