程序填空1

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值