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;
}
posted @ 2022-08-12 17:23  new-code  阅读(180)  评论(0)    收藏  举报