《剑指offer》题目45:圆圈中最后剩下的数字(约瑟夫环)

xiaoxiao2021-02-28  85

有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演。哪个小朋友不用表演?(注:小朋友的编号是从0到n-1)

解题思路 这是一个常见的算法题-约瑟夫环

使用一个list模拟循环队列,设置指针指向list头部进行循环计数,每计数一次指针加一。如果指针到尾部,重新置到头部。当队列大小为1时,所剩下的即为所求。 #include "stdafx.h" #include"iostream" #include"list" #include"algorithm" using namespace std; int LastRemaining_Solution(int n, int m) { if (n < 1 || m < 1) return -1; list<int> input; for (int i = 0; i < n; i++) { input.push_back(i); } list<int>::iterator current=input.begin(); while (input.size()!=1) { for (int i = 0; i < m - 1; i++) { current++; if (current == input.end()) { current = input.begin(); } } list<int>::iterator next = ++current; if (next == input.end()) { next = input.begin(); } --current; input.erase(current); current = next; } return *current; } int main() { int n=LastRemaining_Solution(10, 2); cout << n << endl; system("pause"); return 0; }
转载请注明原文地址: https://www.6miu.com/read-84540.html

最新回复(0)