天天看点

圆圈中最后剩下的数字

题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

这就是有名的约瑟夫(Josephuse)环问题。可以用环形链表模拟圆圈的经典解法。

分析:用模板库中的std::list来模拟一个环形链表。由于std::list本身不是一个环形结构,因此每当迭代器扫描到链表末尾的时候,要记得把迭代器移到链表的头部,这样就相当于按照顺序在一个圆圈里遍历了。

这种思路的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<code>int</code> <code>LastRemaining(unsigned </code><code>int</code> <code>n, unsigned </code><code>int</code> <code>m)</code>

<code>{</code>

<code>    </code><code>if</code><code>(n &lt; 1 || m &lt; 1)</code>

<code>        </code><code>return</code> <code>-1;</code>

<code>    </code> 

<code>    </code><code>unsigned </code><code>int</code> <code>i = 0;</code>

<code>    </code><code>list&lt;</code><code>int</code><code>&gt; numbers;</code>

<code>    </code><code>for</code><code>(i = 0; i &lt; n; ++i)</code>

<code>        </code><code>numbers.push_back(i);</code>

<code>    </code><code>list&lt;</code><code>int</code><code>&gt;::iterator current = numbers.begin();</code>

<code>    </code><code>while</code><code>(numbers.size() &gt; 1)</code>

<code>    </code><code>{</code>

<code>        </code><code>for</code><code>(</code><code>int</code> <code>i = 1; i &lt; m; ++i)</code>

<code>        </code><code>{</code>

<code>            </code><code>current++;</code>

<code>            </code><code>if</code><code>(current == numbers.end())</code>

<code>                </code><code>current = numbers.begin();</code>

<code>        </code><code>}</code>

<code>        </code> 

<code>        </code><code>list&lt;</code><code>int</code><code>&gt;::iterator next = ++current;</code>

<code>        </code><code>if</code><code>(next == numbers.end())</code>

<code>            </code><code>next = numbers.begin();</code>

<code>        </code><code>--current;</code>

<code>        </code><code>numbers.erase(current);</code>

<code>        </code><code>current = next;</code>

<code>    </code><code>}</code>

<code>    </code><code>return</code> <code>*(current);</code>

<code>}</code>

本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3645558.html,如需转载请自行联系原作者

继续阅读