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;

但是,这样的麻烦事还是有的。递归栈的大小问题,所以只能换成非递归方式。

 ...

毕。

posted @ 2013-03-21 19:43  legendmaner  阅读(258)  评论(0编辑  收藏  举报