TBString
时间限制:1 秒内存限制:32 兆特殊判题:否
- 题目描述:
-
淘宝公司内部有一个字符串小王子,他平常无聊就研究字符串。一天,他在研究字符串TBTBBT时,他定义了一个统计函数F,F(S)表示一个字符串当中S出现的次数。对于字符串TBTBBT,那么就有F(T)=3,F(B)=3,F(TB)=2,F(BT)=2。但如果我们已知F(T),F(B),F(TB)和F(BT)这四个值,你能求出满足这4个条件,同时字典序最小的字符串么?若存在,则输出这个字符串;若不存在,则输出-1。
值得注意的是,字符串小王子认为T是比B小的,因为如果B比T小,那么字符串开头可能就会是BTTB,哈哈,你们邪恶了吧。
- 输入:
-
每个测试文件包含多个测试案例, 每个测试案例为一行。
每行包含4个整数,分别表示F(T),F(B),F(TB),F(BT)的值,且所有取值的范围都在[1, 1000000]之间。
- 输出:
对于每个测试案例,输出满足题目条件的最小字符串,仅包含T和B。若答案不存在,输出-1。
- 样例输入:
-
3 3 1 0 1 1 2 0
- 样例输出:
-
TTTBBB -1
- 提示:
-
输出请用puts或者putchar;且测试数据和描述一致,不包括0,样例是例外。
int func7(int t, int b, int tb, int bt, char ch, char a[], int i) { int flag=-1; if ( bt<0 || tb<0 || t<0 ||b<0) { return -1; } if (t==0 && b==0 && tb==0 && bt==0) { return 1; } if (ch=='T') { flag=func7(t-1, b, tb, bt, 'T',a ,i+1); if (flag ==-1) { flag = func7(t, b-1, tb-1, bt, 'B',a ,i+1); } } else { flag=func7(t-1, b, tb, bt-1, 'T',a ,i+1); if (flag == -1) { flag = func7(t, b-1, tb, bt, 'B',a ,i+1); } } if (flag==1) { //printf("%c", ch); a[i]=ch; } return flag; } //调用 char a[100]={0}; int k = func7(10-1,10,9,9,'T', a, 0);//如意需要减1,因为首个'T'先排好了 cout<<a<<endl; if (k==-1) { cout<<k; } cout<<endl;
但是,这样的麻烦事还是有的。递归栈的大小问题,所以只能换成非递归方式。
...
毕。