POJ 1105

题意:给出一个深度为n的满二叉树(根节点为0层),每层都有一个变量xi,然后2^n叶子结点被赋值为0,1。然后给出m个给xi赋值的情况,遇到0就朝左孩子走,反之就右孩子,将遍历到的m个叶子结点输出来。

题解:弄清满二叉树中左孩子就是now*2,右孩子为now*2+1,其他就是模拟了。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 int main()

 6 {

 7     int n,ca=0;

 8     while(scanf("%d",&n),n)

 9     {

10         int x[10],y[10];

11         for(int i=1;i<=n;i++)

12         {

13             char s[5];

14             scanf("%s",s);

15             x[i]=s[1]-'0';

16         }

17         char lef[1000],ans[1000];

18         scanf("%s",lef);

19         int m,top=0;

20         scanf("%d",&m);

21         for(int i=0,now;i<m;i++)

22         {

23             char s[10];

24             scanf("%s",s);

25             for(int j=0;s[j]!='\0';j++)

26                 y[j+1]=s[j]-'0';

27             now=1;

28             for(int j=1;j<=n;j++)

29             {

30                 if(y[x[j]]==0)

31                     now*=2;

32                 else

33                     now=now*2+1;

34             }

35             ans[top++]=lef[now-(1<<n)];

36         }

37         ans[top++]='\0';

38         printf("S-Tree #%d:\n%s\n\n",++ca,ans);

39     }

40     return 0;

41 }

你可能感兴趣的:(poj)