S-Trees UVA - 712(建树即可)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意:一堆废话。。。。。大概意思就是有一颗完全二叉树(注意:是完全二叉树,这个特点可以利用一下),然后有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;
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值