题目大意:一堆废话。。。。。大概意思就是有一颗完全二叉树(注意:是完全二叉树,这个特点可以利用一下),然后有n层,每层的编号是xi xj xk,最后一层即叶子节点是一个01序列,然后给出m条指令,从根节点走,0往左边走,1往右边走,问你最后走到的叶子节点的值是什么?
思路:一开始我是想建树,但是实现起来太麻烦了,然后因为是一颗完全二叉树并且前n-1层并没赋值,然后用数组去维护最后一层节点的值即可,用左子树2i,右子树2i+1这个特点就行了。
代码:
#include<iostream>
using namespace std;
const int maxn=1e3+10;
char ch[maxn];
int index[maxn];
int search[maxn];
int f[maxn];
int n,t;
int main(){
int cas=1;
while(scanf("%d",&n)&&n){
cout<<"S-Tree #"<<cas++<<":"<<endl;
int id;
for(int i=1;i<=n;i++){
cin>>ch;
sscanf(&ch[1],"%d",&id);
index[i]=id;
}
string ch;
cin>>ch;int cnt=1<<n;
for(int i=0;i<ch.size();i++){
search[cnt++]=ch[i]-'0';
}
scanf("%d",&t);
while(t--){
cin>>ch;
for(int i=0;i<ch.size();i++){
f[i+1]=ch[i]-'0';
}
int cnt=1;
for(int i=1;i<=n;i++){
int x=f[index[i]];
if(x==0){
cnt=2*cnt;
}else{
cnt=2*cnt+1;
}
if(i==n){
cout<<search[cnt];
}
}
}
cout<<endl<<endl;
}
}