直接上題:
編程題#3:排隊遊戲
來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 內存限制: 65536kB
描述
在幼兒園中,老師安排小朋友做一個排隊的遊戲。首先老師精心的把數目相同的小男孩和小女孩編排在一個隊列中,每個小孩按其在隊列中的位置發給一個編號(編 號從0開始)。然後老師告訴小朋友們,站在前邊的小男孩可以和他後邊相鄰的小女孩手拉手離開隊列,剩餘的小朋友重新站攏,再按前後相鄰的小男孩小女孩手拉 手離開隊列遊戲,如此往復。由於教師精心的安排,恰好可以保證每兩個小朋友都能手拉手離開隊列,並且最後離開的兩個小朋友是編號最小的和最大的兩個小朋 友。(注:只有小男孩在前,小女孩在後,且他們兩之間沒有其他的小朋友,他們才能手拉手離開隊列)。請根據老師的排隊,按小女孩編號從小到大的順序,給出 所有手拉手離開隊列的小男孩和小女孩的編號對。
輸入
用一個字符串代表小朋友隊列。字符串中只會出現兩個字符(樣例輸入裏用的是 括號但實際數據則不一定),分別代表小男孩和小女孩,首先出現的字符代表小男孩,另一個字符代表小女孩。小孩總數不超過100
輸出
按小女孩編號順序,順序輸出手拉手離開隊列的小男孩和小女孩的編號對,每行一對編號,編號之間用一個空格分隔。
樣例輸入
((()(())())(()))
樣例輸出
2 3 5 6 4 7 8 9 1 10 12 13 11 14 0 15
#include<iostream>
using namespace std;
char children[101];
int boy = 0;//記錄男生的數目
int couple = 0;//記錄狗男女的數目
char m, f;//男,女
int date() {//函數名叫yue pao 。。。
for (int i = 0; i < 2 * boy; i++) {
bool stay = true;
if (children[i] == m) {
for (int j = i + 1; j < 2 * boy; j++) {
if (children[j] == m)
break;//不考慮男同問題,所以這裏break,先讓後面的繼續
if (children[j] == f) {
children[i] = ' ';
children[j] = ' ';
cout << i <<' '<< j << endl;
couple++;
stay = false;//約到了,就不用在這浪費時間了,所以把位子清空,可以嘿嘿嘿去了。。。。
break;
}
}
}
if (stay == false)
break;//有人約到就跳出這層循環
}
if (couple != boy)//因爲只考慮異性戀,所以如果情侶數目跟男生數目不相等,就證明還有男的是單身狗,所以繼續遞歸
date();
return 0;
}
int main(){
cin.getline(children, 101);
m = children[0];//根據題意,無論第一個人長什麼樣,我們都把他當男的看
for (int i = 0; i < 100; i++) {
if (children[i] != m) {
f = children[i];//不考慮有第三種性別的存在,所以長得跟男的不一樣的,一律視爲女的
break;
}
}
for (int i = 0; i < 100; i++) {
if (children[i] == m)
boy++;//數數有多少個男生
}
date();
return 0;
}