转圈游戏

Posted seamusopen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转圈游戏相关的知识,希望对你有一定的参考价值。

题目描述:
编号从1到N的小朋友们围成了一圈。现在从1号开始报数,每个报出3的小朋友退出圈子,下一位从1开始重新报数。那么,最后剩下的那一位会是谁呢?


输入格式:
输入N的值。


输出格式:
输出留在圈里的最后一位小朋友的编号。


样例1输入:
3


样例1输出:
2


样例2输入:
100


样例2输出:
91

 

#include <iostream>
#include <list>
using namespace std;
list<int> child;
void circle(list<int>::iterator &ite)
{
    if (ite == child.end())
    {
        ite = child.begin();
    }
}
int main()
{
    int N;
    cin >> N;
    
    for (int i = 1; i <= N; i++)
    {
        child.push_back(i);
    }
    list<int>::iterator ite=child.begin(); //1
    while (1)
    {
        if (child.size() == 1)
            break;
        circle(++ite);//2
        circle(++ite);//3
        child.erase(ite++);//1
        circle(ite);
    }
    cout << *(child.begin())<<endl;


    return 0;
}

 erase(ite)删除迭代器指向的节点  因为不是顺序存储的删掉当前节点后,无法遍历到往后的节点  就会造成迭代器失效,可以用以下两总方式来避免

1. child.erase(ite++);
2. ite=child.erase(ite);














以上是关于转圈游戏的主要内容,如果未能解决你的问题,请参考以下文章

NOIP201305转圈游戏

P1965 转圈游戏

Luogu P1965 转圈游戏

codevs 3285 转圈游戏

转圈游戏

2019.7.10 校内测试题 转圈游戏