本文主要是介绍uva 712 S-Trees,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原题:
题目太长了,不网上贴了。
题目大意:
先给你一个数n,告诉你这是一个n层的完全二叉树,每层都对应一个字母xi,再给你一个字符串代表叶子点的值。接下来给你一个数m,有m个查询字符串,每个字符串中只有0和1,其中0代表从根向左子树走,1代表向右。最后问你m个查询到的叶子节点的值组成一串是多少。
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iomanip>
#include<set>
#include<fstream>
#include <limits.h>
using namespace std;
//fstream output,input;int tree[1024];
int n,m;
vector<int> ans;
int main()
{ios::sync_with_stdio(false);string s;int tmp,x=1;while(cin>>n,n){memset(tree,-1,sizeof(-1));ans.clear();for(int i=0;i<n;i++)cin>>s;cin>>s;int k=(int)pow(2,n);for(int i=0;i<s.size();i++)tree[k+i]=s[i]-'0';cin>>m;for(int i=0;i<m;i++){cin>>s;tmp=1;for(int j=0;j<s.size();j++){if(s[j]=='0')tmp*=2;elsetmp=tmp*2+1;}ans.push_back(tree[tmp]);}cout<<"S-Tree #"<<x++<<":"<<endl;for(int i=0;i<ans.size();i++)cout<<ans[i];cout<<endl;cout<<endl;}return 0;
}
解答:
这题刚读的时候还真给我吓到,以为要多费劲呢。读完了以后感觉这题就是一个废题,不用建树,直接用数组存储即可。其中输入的每个xi值没有用,最后遍历查询字符串的时候如果是0表示往左走就让tmp*2,往右走就让tmp*2+1d,最后就到叶子节点了,把值取出即可。
这篇关于uva 712 S-Trees的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!