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;
}



posted @ 2014-10-23 13:24  颜威  阅读(100)  评论(0编辑  收藏  举报