1. 程式人生 > >uva712 -- S-Trees

uva712 -- S-Trees

題目連結

這題在看題的時候我認為要建立二叉樹,在寫的時候發現不需要建樹,只需要根據二叉樹的一個性質:對於編號為k的結點(k從0開始計數),其左子結點的編號為2*k+1,右子結點的編號為2*k+2,題目中已經告訴我們vva序列中取0的時候往左走,取1的時候往右走,葉子結點的序列也給出了,所以我們從根節點根據vva序列往下走,走到葉子結點,得到葉子結點的編號,然後求出此葉子結點是第幾個葉子結點,在所給的葉子結點序列裡輸出對應的葉子結點就行了。有一點需要注意:二叉樹的層編號不一定是從1開始的,比如測試用例給出的x3,x1,x2就不是從1開始的,而輸入的vva序列的編號一定是從1開始的,所以我們要對輸入的vva進行轉化,使vva中的資料以層編號為序排列。具體程式碼如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;

int n,m;
int level[10];  //記錄層編號
string leaf;    //葉子結點序列
int nonLeaves;     //非葉子結點的個數

char solve(string str)
{
    int k=0;
    for(int i=0;i<str.length();i++)
        k=(str[i]=='0'?(2*k+1):(2*k+2));
    return leaf[k-nonLeaves];
}

int main()
{
    //freopen("test.txt","r",stdin);
    int no=0;
    while(cin>>n&&n)
    {
        printf("S-Tree #%d:\n",++no);
        memset(level,0,sizeof(level));
        nonLeaves=(1<<n)-1;
        for(int i=0;i<n;i++)    //輸入層編號,去掉前面的x
        {
            string str;
            cin>>str;
            level[i]=str[1]-'0';
        }
        cin>>leaf;
        int m;
        cin>>m;
        string result="";
        while(m--)
        {
            string vva;
            cin>>vva;
            string trans=vva;
            for(int i=0;i<vva.length();i++) //對vva進行轉換
                trans[i]=vva[level[i]-1];
            char ans=solve(trans);
            result+=ans;
        }
        cout<<result<<endl<<endl;
    }
    return 0;
}