码迷,mamicode.com
首页 > 其他好文 > 详细

转圈游戏

时间:2018-08-06 00:33:48      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:space   输入格式   就会   for   stream   避免   i++   turn   游戏   

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

转圈游戏

标签:space   输入格式   就会   for   stream   避免   i++   turn   游戏   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!