AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 2. Data Structures :: Binary Trees
解题报告:
1、题目太长了,差点失去耐心。:)
2、其实无非就是顺着树走,找到叶子的值,不要被那个函数迷惑。
3、往左走为0,往右走为1。若树的深度为n,则叶子的数目为2^n。上图叶子从左到右代表的情况分别是:000、001、010、011、...、111,用十进制表示0~2^n-1。
AC代码:
// 712 - S-Trees
#include <iostream>
#define MAXN 7
using namespace std;
int No = 1;
int a[1<<MAXN]; // 代表0~2^n-1的情况
char tmp[(1<<MAXN)+1], result[(1<<MAXN)+1];
char line[MAXN+1], s[MAXN][3];
int main()
{
int n, t, sum;
while(cin>>n && n!=0)
{
for(int i=0; i<n; i++) // 存放x1、x2...
cin >> s[i];
cin >> tmp; // 从左到右叶子的值
for(int i=0; i<(1<<n); i++)
a[i] = tmp[i] - '0'; // a[i]代表第i条路径的值
cin >> t;
for(int k=0; k<t; k++)
{
sum = 0;
cin >> line; // 求出每条路径的“和”
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(s[j][1] == i+'1')
{
sum += (line[i]-'0')<<(n-j-1);
break;
}
result[k] = a[sum] + '0';
}
result[t] = '\0';
cout << "S-Tree #" << No++ << ":" << endl;
cout << result << endl << endl;
}
return 0;
}