题目链接: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;
}