消除失败者

时间:2015-04-27 11:26:53

标签: c++ vector

我正在尝试自学C ++,而且我在我工作的书中遇到了这个项目项目:

在古老的土地上,美丽的公主夏娃有许多追求者。她决定采用以下程序来确定她会嫁给哪个追求者。首先,所有的追求者将一个接一个地排队并分配号码。

第一个追求者是数字1,第二个数字是2,依此类推到最后一个追求者,数字n。从第一个追求者开始,她将计算三个追求者(由于她名字中的三个字母),第三个追求者将从赢得她的手并从线上移除。然后夏娃将继续,再计三个追求者,并消除每三个追求者。当她到达终点时,她会从头开始计算。

例如,如果有六个追求者,那么淘汰过程将如下进行:

123456最初的追求者名单,从1开始计算

12456求婚3被淘汰,继续从4开始算。

1245求婚者6被淘汰,继续从1开始计算

125求婚4被淘汰,继续从5开始计算

15名求婚者2被淘汰,继续从5开始算。

1个求婚5被淘汰,1个是幸运获胜者

编写一个程序,使用向量来确定如果有n个追求者,你应该站在哪个位置来嫁给公主。您会发现Vector类中的以下函数很有用:

v.erase(ITER);

//删除iter位置的元素

例如,要使用此函数从名为theVector的矢量变量的开头擦除第四个元素,请使用

theVector.erase(theVector.begin()+ 3);

使用数字3是因为向量中的第一个元素位于索引位置0。

我写了一些初步代码,但是我很难弄清楚在第一个求婚者(即第三个求婚者)被淘汰后如何告诉程序从第四个求婚者开始计算,依此类推。也许嵌套循环可以工作?我在网上找到了使用课程的解决方案,但我很难理解,而且我觉得有一种更简单的方法可以解决这个问题,任何帮助都会非常感激。

#include <iostream>
#include <vector>

using namespace std;

int main ()
{
 int n;
 vector<int> vec;
 cout << "Enter the number of suitors: " << endl;
 cin >> n;

 // set some values (from 1 to n)
 for(int i = 0; i <= n; i++){ 
  vec.push_back(i); 
 }
 // erase third suitor
  vec.erase(vec.begin()+2);

 // print vector with erased suitor
  for(unsigned i = 0; i <= vec.size(); i++){
   cout << vec[i] << endl;
   }


 }

3 个答案:

答案 0 :(得分:2)

首先,你的程序中有两个错误:你最初将[0, n]放在向量中,应该是[1, n],并且在打印向量的内容时,你使用{ {1}}它应该是<=

现在提出实际问题。我们想要使用大小为2的步骤(当前人右边的第二个人)迭代向量:

<

然而,当我们到达阵列的末尾时,我们想要从前面继续计数。为此,我们可以使用模运算符for (int i = 0; i < vec.size(); i += 2)

%

这会将for (int i = 0; i < vec.size(); i = (i + 2) % vec.size()) 限制在i范围内。因此,我们的循环条件现在没用了。相反,当向量的大小为1时,我们需要注意终止循环:

[0, vec.size() - 1]

将它们放在一起,我们得到以下结果:

for (int i = 0; vec.size() > 1; i = (i + 2) % vec.size())

或等效地:

for (int i = 0; vec.size() > 1; i = (i + 2) % vec.size())
    vec.erase(vec.begin() + i + 2);

此循环终止时向量中唯一的元素是幸运者的数量。

编辑:要在每次消除后打印出载体的内容,请尝试以下操作:

for (int i = 2; vec.size() > 1; i = (i + 2) % vec.size())
    vec.erase(vec.begin() + i);

答案 1 :(得分:0)

使用相对定位并利用vec.erase()的返回值。

newpos = vec.erase(pos);

这里'newpos'指向被删除元素之后的元素。意思是,{1,2,3,4,5,6}中的'3'听话会让你指向'4'。然后你可以做

pos = vec.begin();
while (pos != vec.end()) {
   erasePos = // compute erasing position relative to 'pos'
              // e.g. pos + 2, within bounds
   pos = vec.erase(erasePos);
}

您需要循环执行此操作。

答案 2 :(得分:0)

对于那个只是迭代到结尾并循环回到开头的用例,我会使用elixir(function(mix) { mix.less('app.less') .copy('underscore/underscore.js', 'public/js/vendor/underscore.js'); }); 而不是[14:12:58] Using gulpfile ~/Public/balloonprinting_l5/gulpfile.js [14:12:58] Starting 'default'... [14:12:58] Starting 'less'... [14:12:58] Running Less: resources/assets/less/app.less [14:12:59] Finished 'default' after 506 ms [14:13:00] gulp-notify: [Laravel Elixir] Less Compiled! [14:13:00] Finished 'less' after 1.74 s [14:13:00] Starting 'copy'... [14:13:00] Finished 'copy' after 2.86 ms 。该计划可能是:

list