码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 712-S-Trees(满二叉树的简单查询)

时间:2015-08-19 22:37:32      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

题意:给一棵满二叉树,叶子节点赋予权值,0或者1,对于每个查询输出叶子节点的权值,每个查询0代表往左走,1代表往右走,这题坑的地方是层的访问顺序,如第二组测试,由上到下依次是x3,x1,x2,假如给一个查询110,则从上到下的顺序是011,对应第3个叶子节点。二进制数转变成十进制数对应的叶子的权值,输出即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
int deep;        //最大深度
string L;        //叶子对应的权值的字符串
int belong[10],leaf[1005],ans[1005];    //belong[]代表Xi对应第几层
void Get_Tree()
{
    for(int i=0;i<deep;i++)
    {
        char S[4];
        scanf("%s",S);
        int id=S[1]-‘0‘-1;    //分离编号
        belong[id]=i;         //记录
    }
}
void Get_Leaf()
{
    cin>>L;  //输入叶子权值
}
int keep[10];
void query(int Case)
{
    int M;
    cin>>M;
    string ret;
    for(int i=1;i<=M;i++)
    {
        string command;
        cin>>command;
        int len=command.length();
        for(int i=0;i<len;i++)
        {
            int a=command[i]-‘0‘;
            keep[belong[i]]=a;        //保存下来
        }
        int id=0;
        for(int i=0;i<len;i++) id=id*2+keep[i];  //得到十进制数
        ret+=L[id];                              
    }
    printf("S-Tree #%d:\n",Case);
    cout<<ret<<endl;
    cout<<endl;
}
int main()
{
    int kase=0;
    while(cin>>deep)
    {
        if(!deep)  break;
        Get_Tree();
        Get_Leaf();
        query(++kase);
    }
    return 0;
}

UVA 712-S-Trees(满二叉树的简单查询)

标签:

原文地址:http://www.cnblogs.com/wust-ouyangli/p/4743147.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!