#输入
3
10001011
#输出
IBFBBBFIBFIIIFF
AC代码:
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1030;
char s[maxn];
void solve(int low,int hig){
// if(low >= hig) return;
int mid = (low + hig)/2;
if(low!=hig){
solve(low,mid);
solve(mid+1,hig);
}
int a = 0,b = 0;
for(int i=low;i<=hig;i++){
if(s[i] == '0'){
a++;
}
if(s[i] == '1'){
b++;
}
}
if(a&&b) cout<<"F";
else if(a&&!b) cout<<"B";
else cout<<"I";
}
int main()
{
int n;
cin>>n;
cin>>s+1;
solve(1,pow(2,n));
return 0;
}
解析:
〇题解来源说明:算法思路从洛谷博主wuhao1027处借鉴而来,仅供参考学习使用。
①解题思路:遇到有关树(二叉树)的题目,不一定要将树完整的构建出来(参考之前由前中序遍历求得后序遍历的题目),本题正是使用了这样的思路,solve()函数中也用到了类似折半查找的分块思想。
②核心算法:
1)递归部分
int mid = (low + hig)/2;
if(low!=hig){
solve(low,mid);
solve(mid+1,hig);
}
进入solve()函数后先求得mid的值,然后根据条件进行递归。
2)输出部分
int a = 0,b = 0;
for(int i=low;i<=hig;i++){
if(s[i] == '0'){
a++;
}
if(s[i] == '1'){
b++;
}
}
if(a&&b) cout<<"F";
else if(a&&!b) cout<<"B";
else cout<<"I";
a和b两个变量的作用是记录子串中0和1出现的数量,并按照条件进行输出。
③结尾:当把这道题的题意读懂之后,我认为这道题可以迎刃而解了。