主要还是check和dfs两个函数
dfs每次都把左子树搜到底
然后进入右子树
再进入右子树中的左子树
关键是
把dfs左子树放在dfs右子树上
保证先搜左子树再搜右子树
#include<iostream>
#include<algorithm>
#define gold_m main
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll mypp(int x, int n) {
ll temp=x,result=1;
while(n) {
if(n%2)
result*=temp;
temp*=temp;
n/=2;
}
return result;
}
char s[2020];
char check(char s[],int x,int y) {
int a=0,b=0;
//int len=strlen(s);
for(int i=x; i<=y; i++) {
if(s[i]=='1') a++;
if(s[i]=='0')b++;
}
if(a&&b) return 'F';
if(a==0&&b) return 'B';
if(a&&b==0) return 'I';
}
void dfs(int left ,int right) {
if(left!=right) {
dfs(left,(right+left)/2);
dfs((right+left)/2+1,right);
}
char h=check(s,left,right);
cout<<h;
}
int gold_m() {
int n,m;
cin>>m;
n =mypp(2,m);
for(int i=1; i<=n; i++)
cin>>s[i];
dfs(1,n);
return 0;
}
/*
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
*/