UVa-712-S-Trees
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; }