POJ 3517 And Then There Was One 约瑟夫环

题意:约瑟夫环。

题解:直接模拟了···

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

struct NODE
{
    int id;
    NODE *next, *pre;
};

NODE node[10009];

void build_list ( int n )
{
    for ( int i = 2; i < n; i++ )
    {
        node[i].id = i;
        node[i].pre = &node[i-1];
        node[i].next = &node[i+1];
    }
    node[1].id = 1;
    node[1].next = &node[2];
    node[1].pre = &node[n];
    node[n].id = n;
    node[n].next = &node[1];
    node[n].pre = &node[n-1];
}

int play ( int n, int k, int m )
{
    NODE *p;
    node[m].pre->next = node[m].next;
    node[m].next->pre = node[m].pre;
    p = &node[m];
    int cnt = n - 1, tmp;
    while ( cnt > 1 )
    {
        tmp = k % cnt;
        if ( tmp == 0 ) tmp = cnt;
        for ( int i = 1; i <= tmp; i++ )
            p = p->next;
        p->pre->next = p->next;
        p->next->pre = p->pre;
        cnt--;
    }
    return p->next->id;
}

int main()
{
    int n, k, m;
    while ( scanf("%d%d%d",&n,&k,&m) )
    {
        if ( !n && !k && !m ) break;
        build_list(n);
        printf("%d\n",play(n,k,m));
    }
    return 0;
}


 

你可能感兴趣的:(list,Build)