S-Trees (二叉树的性质)

题目链接:https://www.luogu.org/problemnew/show/UVA712

题目大意:有一个n层的满二叉树,每个子节点都对应了一个确定的值(共2^n个),有m个访问值,每个访问值由n个0,1组成,0表示走左子节点,1表示走右子节点,这样每个访问值都对应了原二叉树的子节点的一个确定的值,最后输出m个访问值 

解题思路:先用一个数组保存下2^n个节点的值,然后将输入的每个访问值,由二进制转化为10进制数,然后找到对应的保存节点数组的值,用另一个数组保存答案

其实理解了题意这个题真的很容易解决。

贴上代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,kase=1;
    while(~scanf("%d",&n),n){
        int No_c[1000]={0},C_LR[1000]={0};
        char x[100];

        for(int i=1;i<=n;i++){
            scanf("%s",x);
            No_c[x[1]-'0']=i;
        }
        char D[1000]={0};
        scanf("%s",D);

        int Q;
        scanf("%d",&Q);
        char ans[1000]={0};
        for(int qq=0;qq<Q;qq++){
            char q[1000]={0};
            scanf("%s",q);
            int q_len=strlen(q),indx=0;
            for(int i=0;i<q_len;i++){
                C_LR[ No_c[i+1] ]=q[i]-'0';
            }
            /*for(int i=0;i<n;i++){
                printf("%d\n",C_LR[i]);
            }*/
            for(int i=1;i<=n ;i++){

                if(C_LR[i]){
                    indx=indx*2+1;      // Right
                }else {
                    indx=indx*2;        //Left
                }
                //printf("index :  %d ",indx);
            }

            sprintf(ans+qq,"%c",D[indx]);
        }
        printf("S-Tree #%d:\n",kase++);
        printf("%s",ans);
        printf("\n\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/z_sea/article/details/80710204
今日推荐