题目大意: 给一棵完整的树: 给出每一层的节点号(xi,同一层的节点共用一个号,从第一层到第n层不一定是从x1到xn,是打乱的) 给出所有叶子节点的值(如n=3,叶子节点有8个) 给出路径v1v2v3...Vn:0走左子树,1走右子树,但是路径是严格分配给x1x2x3...xn的,即如果第一层节点即根节点不是x1而是x3,走的第一步要根据路径的v3来确定左子树还是右子树 输出最后到达的叶子节点的值 思想: 到达每一个叶子节点的路径是唯一的 s=s*2+(vvn[i][j]-‘0‘); 数据结构的知识 父节点是i,左孩子是i*2,右孩子是2*i+1; 在这题中只存储叶子节点即可
|
||||||||
Online Judge |
Problem Set |
Authors |
Online Contests |
User |
||||
Web Board Home Page F.A.Qs Statistical Charts |
窗体顶端 Problems 窗体底端 |
窗体顶端 Register 窗体底端 |
Current Contest Past Contests Scheduled Contests Award Contest |
shoujizhushou Log Out Mail:1(0) Login Log Archive |
Language:Default S-Trees
Description A Strange Tree (S-tree) over the variable set Xn = {x1,x2,...,xn} is a binary tree representing a Boolean function f:{0,1}->{0,1}. Each path of the S-tree begins at the root node and consists of n+1 nodes. Each of the S-tree‘s nodes has a depth, which is the amount of nodes between itself and the root (so the root has depth 0). The nodes with depth less than n are called non-terminal nodes. All non-terminal nodes have two children: the right child and the left child. Each non-terminal node is marked with some variable xi from the variable set Xn. All non-terminal nodes with the same depth are marked with the same variable, and non-terminal nodes with different depth are marked with different variables. So, there is a unique variable xi1 corresponding to the root, a unique variable xi2 corresponding to the nodes with depth 1, and so on. The sequence of the variables xi1,xi2,...,xin is called the variable ordering. The nodes having depth n are called terminal nodes. They have no children and are marked with either 0 or 1. Note that the variable ordering and the distribution of 0‘s and 1‘s on terminal nodes are sufficient to completely describe an S-tree. Figure 1: S-trees for the x1 and (x2 or x3) function On the picture, two S-trees representing the same Boolean function,f(x1,x2,x3) = x1 and (x2 or x3), are shown. For the left tree, the variable ordering is x1, x2, x3, and for the right tree it is x3, x1, x2. (x1 = b1, x2 = b2, ..., xn = bn) with b1,b2,...,bn in {0,1}. For instance, ( x1 = 1, x2 = 1 x3 = 0) would be a valid VVA for n = 3, resulting for the sample function above in the value f(1,1,0) = 1 and (1 or 0) = 1. The corresponding paths are shown bold in the picture. Input The input contains the description of several S-trees with associated VVAs which you have to process. Each description begins with a line containing a single integer n, 1 <= n <= 7, the depth of the S-tree. This is followed by a line describing the variable ordering of the S-tree. The format of that line is xi1 xi2 ...xin. (There will be exactly n different space-separated strings). So, for n = 3 and the variable ordering x3, x1, x2, this line would look as follows: Output For each S-tree, output the line "S-Tree #j:", where j is the number of the S-tree. Then print a line that contains the value of f(x1,x2,...,xn) for each of the given m VVAs, where f is the function defined by the S-tree. Sample Input 3 x1 x2 x3 00000111 4 000 010 111 110 3 x3 x1 x2 00010011 4 000 010 111 110 0 Sample Output S-Tree #1: 0011 S-Tree #2: 0011 Source |
[Submit] [Go Back] [Status] [Discuss]
代码:
# include <iostream>
# include <cstdio>
# include <string>
# include <cmath>
using namespace std;
int main()
{
int n,nvvn,i,j,s,m=0;
char ord[30],tnod[300];
cin>>n;
while(n!=0)
{
m++;
int* order=new int[n];
getchar();
gets(ord);
for(i=0;i<n;i++)
{
order[i]=(ord[1+i*3]-‘0‘)-1;
}
cin>>tnod;
cin>>nvvn;
char (*vvn)[10]=new char[nvvn][10];
for(i=0;i<nvvn;i++)
cin>>vvn[i];
cout<<"S-Tree #"<<m<<":"<<endl;
for(i=0;i<nvvn;i++)
{
for(j=0,s=0;j<n;j++)
{
s=s*2+(vvn[i][j]-‘0‘);
}
cout<<tnod[s];
}
cout<<endl;
cout<<endl;
cin>>n;
}
return 0;
}