FBZ串问题 NOIP1998
已知一个由0,1字符组成的长为2n的字符串。请按.以下规则将已给出的字符串分解成FBFBZ串:
①若其中字符全为‘1’,则称其为‘B’串;
②若其中字符全为‘0’,则称其为‘Z’串;
③若不全为‘0’,同时也不全为‘1’,则称‘F’串。若此串为F串。则应将此串分解为2个长为\(2^{n-1}\)的子串。
对分解后的子串,仍按以上规则继续分解,直到全部为B串或为Z串为止。

例如n=3时,给出0—1串为:‘10111001’,最后输出:FFFBZBFFBZFZB 问题:给出0,1串,分解成FBZ串。
01 #include<iostream>
02 #include<cstdio>
03 using namespace std;
04 const int n=8;
05 int i,j,stl1,stl2,st2,s,t;
06 char str1[n*2+1][n+1],str2[44];
07 int main()
08 {
09 for(i=1;i<n*2;++i)
10 for(j=1;j<=n;++j) str1[i][j]=' ';
11 stl1=1;stl2=1;st2=0;
12 for(i=1;i<=n;++i) str1[1][i]=getchar();
13 while(--1--)
14 {
15 s=0;t=0;
16 for(i=1;i<=n;++i)
17 {
18 if(str1[stl2][i]=='1') s++;
19 if(str1[stl2][i]=='0') t++;
20 }
21 if(--2--)
22 {
23 st2++;str2[st2]='B';
24 }
25 else if(s==0)
26 {
27 st2++;str2[st2]='Z';
28 }
29 else
30 {
31 st2++;str2[st2]='F';j=(s+t)/2;
32 for(s=n*2-2;s>=--3--;--s)
33 for(t=1;t<=n;++t)
34 str1[s+2][t]=str1[s][t];
35 stl1+=2;
36 for(int i=1;i<=j;++i)
37 {
38 str1[stl2+1][i]=str1[stl2][i];
39 str1[stl2+2][i]=--4--;
40 }
41 for(int i=--5--;++i)
42 {
43 str1[stl2+1][i]=' ';str1[stl2+2][i]=' ';
44 }
45 }
46 stl2++;
47 }
48 for(int i=1;i<=st2;++i) printf("%c",str2[i]);
49 return 0;
50 }
解析
#include<iostream>
#include<cstdio>
using namespace std;
const int n=8;
//stl1 扩展的节点 stl2 被扩展的节点
int i,j,stl1,stl2,st2,s,t;
//str1 二维数组 报错所有处理过程字符串
char str1[n*2+1][n+1],str2[44];
int main()
{
for(i=1;i<n*2;++i)
for(j=1;j<=n;++j) str1[i][j]=' ';//初始化str1为空字符
stl1=1;stl2=1;st2=0;
for(i=1;i<=n;++i) str1[1][i]=getchar();//读入输入字符到第一行
while(stl2<=stl1)//被扩展的节点 <=扩展节点
{
s=0;t=0;
for(i=1;i<=n;++i)//统计所有的1 和 0的个数
{
if(str1[stl2][i]=='1') s++;
if(str1[stl2][i]=='0') t++;
}
if(t==0)//如果 0 没有 则全是1 输出B
{
st2++;str2[st2]='B';
}
else if(s==0)//如果1没有 全是0 输出Z
{
st2++;str2[st2]='Z';
}
else
{
st2++;str2[st2]='F';j=(s+t)/2;//如果同时有1和0 输出F 平均分成2个,j为新的串长度
for(s=n*2-2;s>=stl2+1;--s)// 本次增加两行 stl2后续的往后移动2行
for(t=1;t<=n;++t)
str1[s+2][t]=str1[s][t];
stl1+=2;// 产生了2个新节点
for(int i=1;i<=j;++i)// 循环2个串
{
str1[stl2+1][i]=str1[stl2][i];//第一个串 为stl2+1 copy str1[stl2]前j个字符
str1[stl2+2][i]=str1[stl2][i+j];//第一个串 为stl2+1 copy str1[stl2]i+1开始的j个字符
}
for(int i=j+1;i<=n;++i)//把生成串后面的赋值为空字符 由于字符串长度减半 所以j+1 ~ n 不需要
{
str1[stl2+1][i]=' ';str1[stl2+2][i]=' ';
}
}
stl2++;// 无论是什么字符 扩展进入下一个
}
for(int i=1;i<=st2;++i) printf("%c",str2[i]);
return 0;
}
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号