【C++】約瑟夫問題

  • 題目描述:
    在這裏插入圖片描述
    問題分析:
  • 直接利用數組初始化數據,那當我們每次數數數到m的時候,我們理論上是要出圈的,但是每次出圈意味着數據的刪除操作,時間複雜度會變高,那麼我們就不刪除,就將此時的值置爲0即可,那麼當下一次遇到這個位置的時候,我們就跳過就行了。在用一個數來記錄數組中還有幾個數不是0的,當只剩下一個的時候,我們就終止此次數數。
  • 注:因爲沒有使用循環鏈表或數組本身是沒有循環的操作,那麼將報數的數定義在大循環外面,就可以很巧的避免了這個問題。
  • 代碼如下
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;

int main()
{
	int n, m;
	//  輸入描述的是最後爲0結束
	while ((cin >> n >> m) && !(n == 0 && m == 0))
	{
		vector<int> vt(n);
		for (int i = 0; i < n; i++)
			vt[i] = i + 1;
		int a = n; //  標記剩下的猴子
		int b = 0; //  標記報數m
		while (a > 1)
		{
			for (int i = 0; i < n; i++)
			{
				if (vt[i] == 0)
					continue;
				else
					b++;

				if (b == m)     //  報數達到m的時候置爲0
				{
					vt[i] = 0;
					b = 0;
					a--;
				}
			}
		}
		for (auto e : vt)
		{
			if (e != 0)
				cout << e << endl;
		}
	}
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章