首页 > 其他 > 详细

转圈游戏

时间:2018-08-06 00:02:43      阅读:191      评论:0      收藏:0      [点我收藏+]

题目描述:
编号从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);

转圈游戏

原文:https://www.cnblogs.com/seamusopen/p/9427746.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!