1. 程式人生 > >洛谷 P1087 :FBI樹

洛谷 P1087 :FBI樹

https://www.luogu.org/problemnew/show/P1087

 

輸入輸出樣例

輸入樣例#1: 複製

3
10001011

輸出樣例#1: 複製

IBFBBBFIBFIIIFF

在將b[j]置0點時候錯了幾次。

後序遍歷序列就是先左後右再訪問根節點

找出規律,從最小的也就是長度為1的節點開始訪問。

每訪問兩個相同長度的節點,就訪問他們的根節點。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 2020
char str[N];
int a[20],b[20];
int main()
{
	int n,m,i,j;
	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		scanf("%s",str);
		m=pow(2,n);
		for(i=0;i<m;i++)
		{
			if(str[i]=='0')
			{
				printf("B");
				if(!a[1])
					b[1]=1;
			}						
			else
			{
				printf("I");
				if(!a[1])
					b[1]=2;
			}
				
			a[1]++;	
			for(j=1;j<=n+2;j++)
			{
				if(a[j]==2)
				{
					a[j]=0;
					a[j+1]++;
					if(str[i]=='0'&&b[j]==1)
					{
						printf("B");
						if(b[j+1]==0||b[j+1]==1)
							b[j+1]=1;
						else
							b[j+1]=3;
					}			
					else if(str[i]=='1'&&b[j]==2)
					{
						printf("I");
						if(b[j+1]==2||b[j+1]==0)
							b[j+1]=2;
						else
							b[j+1]=3;
					}	
					else
					{
						printf("F");
						b[j+1]=3;
					}
					b[j]=0;		  //重要
				}
			}	
		}
		printf("\n");
	}
	return 0;
}