1. 程式人生 > >UVA 11988 Broken Keyboard (Beiju Text)

UVA 11988 Broken Keyboard (Beiju Text)

題目:


首先,括號對前面的字串的輸出是無法分割的。

也就是說,括號右邊的字元只能輸出到前面這個字串的2邊。

這個和算術表示式裡面的小括號是很像的,小括號是封閉的,括號外面的內容無法影響裡面的內容。

所以,這個題目可以模擬算術表示式,找到唯一的核心分割點,比如a*b-c+d中的+,又比如a*b-c*d中的-

找到之後,遞迴即可。

程式碼:

#include<iostream>
#include<string>
#include<string.h>
#include<stack>
using namespace std;

stack<int
>s; char c[100005]; void f(int high) { if (s.empty()) { for (int i = 0; i <= high; i++)printf("%c", c[i]); return; } int key = s.top(); s.pop(); if (c[key] == ']') { f(key - 1); for (int i = key + 1; i <= high; i++)printf("%c", c[i]); } else { for (int i = key + 1; i <= high;
i++)printf("%c", c[i]); f(key - 1); } } int main() { stringstr; int l; while (scanf("%s", c) != EOF) { l = strlen(c); while (!s.empty())s.pop(); for (int i = 0; i < l; i++)if (c[i] == '[' || c[i] == ']')s.push(i); f(l-1); cout << endl; } return 0; }