HDU 4841 圓桌問題(約瑟夫問題) —— C++

圓桌上圍坐着2n個人。其中n個人是好人,另外n個人是壞人。如果從第一個人開始數數,數到第m個人,則立即處死該人;然後從被處死的人之後開始數數,再將數到的第m個人處死……依此方法不斷處死圍坐在圓桌上的人。試問預先應如何安排這些好人與壞人的座位,能使得在處死n個人之後,圓桌上圍坐的剩餘的n個人全是好人。

Input
多組數據,每組數據輸入:好人和壞人的人數n(<=32767)、步長m(<=32767);

Output
對於每一組數據,輸出2n個大寫字母,‘G’表示好人,‘B’表示壞人,50個字母爲一行,不允許出現空白字符。相鄰數據間留有一空行。

Sample Input

2 3
2 4

Sample Output

GBBG
//空行
BGGB

#include <vector>
#include <iostream>
using namespace std;
int main(){
	vector<int>table;
	int n, m;
	while (cin >> n >> m) {
		table.clear();
		for (int i = 0; i < 2 * n; i++)            //初始化
			table.push_back(i);
		int pos = 0;                               // 記錄要被趕走的人的位置
		while (table.size() > n) {//趕走 n 個人
			pos = (pos + m - 1) % table.size();    //圓桌是個環,可自行畫圖理解
			table.erase(table.begin() + pos);      //趕走壞人,table 人數減 1
		}
		for (int i = 0,j=0; i < 2 * n; i++) {
			if (i % 50 == 0 && i)// 50 個字母一行
				cout << endl;
			if (  j < table.size()&&i == table[j]) {// table 留下的都是好人
				j++;                               //注: j < table.size() 和 i == table[j] 順序不能變
				cout << "G";                       //否則,table 會越界
			}
			else
				cout << "B";
		}
		cout << endl << endl;                     //留一個空行
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章