1220: FBI树 [递归]

时间限制: 1 Sec 内存限制: 128 MB

提交: 5 解决: 4 状态

题目描述

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

1)T的根结点为R,其类型与串S的类型相同;

2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

输入

第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。

对于40%的数据,N <= 2;

对于全部的数据,N <= 10。

输出

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

样例输入

3
10001011

样例输出

IBFBBBFIBFIIIFF
因为为了练习二叉树才写的这道题,所以第一次是用建立二叉树的方法A的代码略长,后来发现可以递归自己写了个递归,,,最后看到了别人家的递归!!!下面:
巧妙地利用了返回值判断零一串!
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=(1<<10);
char s[maxn+20];
int write(int l,int r)
{
if(l==r)
{
printf("%c",(s[l]=='0')?'B':'I'); //是零表明是B串,输出B并返回0,1表明是I串输出I并返回1
return s[l]=='1';
}
int sl,sr,k=(l+r)/2;
sl=write(l,k),sr=write(k+1,r);
if(sl+sr==0){printf("B");return 0;} //如果左右两部分递归后返回值相加为零说明这是个零串,是二说明是‘1’串
if(sl+sr==2){printf("I");return 1;}
printf("F"); return 3; //否则就是01串
} int main()
{
while( scanf("%s%s",s,s)!=EOF)
write(0,strlen(s)-1),printf("\n");
return 0;
} 自己写的递归,因为加了判断01的部分略长

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[10005];
void dfs(int x,int y)
{
int t1=0,t2=0;
if(x==y) {printf("%c",(s[x]=='1'?'I':'B'));return;}
else{
int m=(x+y)/2;
dfs(x,m);
dfs(m+1,y);
for(int i=x;i<=y;++i) if(s[i]=='0') ++t1;
else if(s[i]=='1') ++t2;
if(t1&&t2) cout<<'F';
else if(t1&&!t2) cout<<'B';
else cout<<'I';
}
}
int main()
{
int n,m,i,j;
while(scanf("%s%s",s,s)!=EOF) dfs(0,strlen(s)-1),printf("\n");
return 0;
}

 

 

~递归递归(FBI树--蓝桥)的更多相关文章

  1. 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

    题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...

  2. 【递归+树】FBI树

    题目描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为BB串,全"1"串称为I串,既含"0& ...

  3. 蓝桥杯之FBI树问题

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  4. Java实现 蓝桥杯VIP 算法训练 FBI树

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  5. C#递归生成HTML树,C#递归生成xml树

    C#递归生成HTML树 public StringBuilder str = new StringBuilder();   //定义一个字符串 private void get_navigation_ ...

  6. 递归遍历JSON树

    递归遍历JSON树 前几天有个人问我,json串的层级无限深,但在json串中的key是已知的,在json串中的value,有些事Object,有些是Array,如何把这些层级无限深的key所对应的v ...

  7. JavaScript通过父节点ID递归生成JSON树

    JavaScript通过父节点ID递归生成JSON树: · 实现思路:通过递归实现(第一次递归的时候查询出所有的父节点,然后通过当前父节点id不断地去查询所有子节点,直到递归完毕返回)   · 代码示 ...

  8. Vijos 1114 FBI树

    描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...

  9. noip普及组2004 FBI树

    FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...

随机推荐

  1. 原 用Tomcat服务器配置https双向认证过程实战

    什么是https? 百度百科足够解释它:http://baike.baidu.com/view/14121.htm 工具:keytool (Windows下路径:%JAVA_HOME%/bin/key ...

  2. 20145337《网络对抗技术》MSF基础应用

    20145337<网络对抗技术>MSF基础应用 一.实验后回答问题 什么是exploit.payload.encode Metasploit这种模块化的设计,大大提高了代码的复用率.exp ...

  3. SmartOS之以太网精简协议栈TinyIP

    做物联网,没有以太网怎么能行!基于Enc28j60,我们团队独立实现了以太网精简协议栈TinyIP,目前支持ARP/ICMP/TCP/UDP/DHCP,还缺一个DNS就完整了.TinyIP内置一个数据 ...

  4. USACO 1.3 Wormholes - 搜索

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  5. IDEA 插件-码云

    插件安装 最新插件版本: 2018.3.1.(2019-01-10 发布)注意:码云 IDEA 插件已由 gitosc 更名为 gitee.新版插件 gitee 菜单已经和 git 菜单合并 通过「插 ...

  6. sqlite3 的一些整理和补充

    一,sqlite3数据库打开时的返回值及其所代表的含义 返回值 描述 返回值 描述 SQLITE_OK=0 返回成功 SQLITE_FULL=13 数据库满,插入失败 SQLITE_ERROR=1 S ...

  7. windows下启动某程序提示缺失**.dll文件的处理方法

    一.背景: 1.os : windows7 64bit 旗舰版 2.启动ftp服务端软件时提示缺失mfc100.dll文件 以上情形亲测有效 二.修复 2.1 从https://cn.dll-file ...

  8. 【入门详解】MyBatis入门基础详解

    什么是mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XM ...

  9. HDU 5887 Herbs Gathering(搜索求01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做, ...

  10. django模型的元数据Meta

    模型的元数据,指的是“除了字段外的所有内容”,例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的.但是,我要说但是,有些元数据选项能给予你 ...