1号
题目
(后补)
int main() {
for(int i = 1; i <= 2*n; ++i)
for(int j = 1; j <= n; ++j)
str1[i][j] = '';
st11 = st12 = 1;
st2 = 0;
for(int i = 1; i <= n; ++i)
str1[1][i] = getchar();
while(________) {
s = t = 0;
for(int i = 1; i <= n; ++i) {
if(str1[st12][i] == '1') s++;
if(str1[st12][i] == '0') t++;
}
if(_______) {
st2++;
str2[st2] = 'B';
}
else if(_______) {
st2++;
str2[st2] = 'Z';
}
else {
st2++,str2[st2] = 'F';j = (s + t)/2;
for(s = n * 2 - 2; s >= _______; --s)
for(t = 1; t <= n; t ++)
str1[s + 2][t] = str1[s][t];
str1 += 2;
for(int i = 1; i <= n; i++){
str1[str2 + 1][i] = str1[stl2][i];
str1[str2 + 2][i] = ______________;
}
for(int i = _______; i++) {
str1[stl2 + 1][i] = '';
str1[str2 + 2][i] = '';
}
}
str2++;
}
for(int i = 1; i <= str2; i++)
printf("%c", str2[i]);
return 0;
}
DJ大佬的讲解
#include<bits/stdc++.h>
using namespace std;
//注意本题是要求先序遍历,结合递归思想去理解
//主函数是用循环代替二分的递归,因此用了stl1,stl2两个指针
int const n = 8;
int i, j, stl1, stl2, st2, s, t;//str2表示要输出的答案串,st2是它的下标指针
char str1[n * 2 + 1][n + 1], str2[44];
int main() {
for(int i = 1; i <= 2*n; ++i)
for(int j = 1; j <= n; ++j)
str1[i][j] = '';//字符串清空(没错,这鬼题目就是不用memset)
st11 = st12 = 1;
st2 = 0;
for(int i = 1; i <= n; ++i)
str1[1][i] = getchar();//输入str1[1],getchar()是读取单个字符的内置函数
while(_stl2<=stl1_____)//由于递归改成了循环,因此用两个指针来限制,stl1指向已经分出的最后一个子串,stl2指向要处理的子串
{
s = t = 0;
for(int i = 1; i <= n; ++i) {
if(str1[st12][i] == '1') s++;//统计"1"
if(str1[st12][i] == '0') t++;//统计"2"
}
if(_t==0__) {
st2++;
str2[st2] = 'B';
}//如果都是"1",则是B串,显然此时t应为0
else if(__s==0__) {
st2++;
str2[st2] = 'Z';
}//道理同上
else//如果既有"1"又有"0"
{
st2++,str2[st2] = 'F';j = (s + t)/2;//由于字符串只有0和1,因此s+t就是字符串的有效总长,j就是其中点
for(s = n * 2 - 2;s >= __stl2+1_;--s)//闲得x疼用s循环
{
for(t = 1;t <= n;t ++)//没错,这个鬼题目为了省变量用t搞循环
{
str1[s + 2][t] = str1[s][t];
}
}/*将所有已存的字符串往后推两个位置,这一步是为了方便给下面的操作空出有效空间,
而下一步中,指针stl2之前的字符串空间已经用过了,毋须后推空出空间,因此只循环到
stl2+1*/
stl1 += 2;//因为又二分出来两个串,因此上限指针后移两位
for(int i = 1;i <= n;i++)
{
str1[stl2 + 1][i] = str1[stl2][i];
str1[stl2 + 2][i] = __str2[stl2][i+j]__;
}//将当前维护的字符串对半分并且赋值到另外两个数组中
for(int i = __j+1__;i<=n__;i++)//赋值后将不要用的空间赋值为空
{
str1[stl2 + 1][i] = '';
str1[str2 + 2][i] = '';
}
}
stl2;//解决了一个已经分出的字符串,stl2指针后移
}
for(int i = 1;i <= str2;i++)
printf("%c", str2[i]);
return 0;
}