洛谷P1319压缩技术详解

大家好,我是你们的大白

好的,以后就这样了,懒得写太多

直入主题:

题目描述

设某汉字由N × N的0和1的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个0,第二个数表示接下来连续有几个1,第三个数再接下来连续有几个0,第四个数接着连续几个1,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N=交替的各位数之和)

输入格式

一行,压缩码。

输出格式

汉字点阵图(点阵符号之间不留空格)。(3<=N<=200)

输入输出样例

输入 #1复制

7 3 1 6 1 6 4 3 1 6 1 6 1 3 7

输出 #1复制

0001000
0001000
0001111
0001000
0001000
0001000
1111111

很简单的一题

他说要用到字符串,但我感觉没必要啊

简单极了

我们分析一下:

一共只要两步,第一步输入

第二步输出

两个循环

那就一个一个的慢慢分析吧

在分析前,给大家一份“演员表”:

主函数前

1、邀请到的a数组(主角)

2、非常重要的n(二号)

主函数中的第一部分

3、简简单单的输入用的sum1

4、和它差不多的弟弟sum2

5、跑龙套的i

主函数内第二部分

6、j,一个看上去是跑龙套,却掌握着换行大权的东西(四号)

7、一个从跑龙套升到重要角色的i,掌握输出要输出什么(三号)

以上变量全为int类型

第一个部分是输入

愉快的输入

可是,你会发现,它没说输入几个啊?!

但它说了,加起来肯定是N*N

sum1闪亮登场!(我在写时,就有一种预感,感觉肯定还有2,但我不确定,就写上了1)

用来统计加起来是多少;

代码:

cin>>n;
int sum1=0,sum2=0;//sum2是后来加的 
for(int i=1;;i++){
	cin>>a[i];
	sum1+=a[i];
	if(sum1==n*n)break;
}

忘说了,先输入n;

第二步要输出了;

这部分比较难,但就是一个for循环

再分成几小部分吧;

第一小部分:判断如果a数组里这个有大于0的数,就输出

想要完成这个,就要先在判断里面让a[i]--

然后,再判断,如果i对二取余等于零,就要输出1,反之输出0(想想为什么)

最后,神秘的j++;

if(a[i]){
	a[i]--;
	if(i%2==0)cout<<1;
	else cout<<0;
	//cout<<a[i]<<" "<<i<<" "<<j<<" ";
	j++;
}

第二小部分是要如果没有了数,就让i++

else{
	i++;
	continue;
	//cout<<"b"<<" ";
}

最后第三部分是要让j到达6的倍数时换行;

if(j%n==0&&j){
	//cout<<"c"<<" ";
	cout<<endl;
}

so easy!

可是,就有人要问了,那要怎么控制i呢???

其实很简单哦,我们改进一下第一步:

cin>>n;
	int sum1=0,sum2=0;//sum2是后来加的 
	for(int i=1;;i++){
		cin>>a[i];
		sum1+=a[i];
		sum2++;
		if(sum1==n*n)break;
	}

可以了吧,只要有一个sum2来统计数量就行了

好了,第二步代码完整:

int j=0;
	for(int i=1;i<=sum2;){//试了半天的输出 
		if(a[i]){
			a[i]--;
			if(i%2==0)cout<<1;
			else cout<<0;
			//cout<<a[i]<<" "<<i<<" "<<j<<" ";
			j++;
		}
		else{
			i++;
			continue;
			//cout<<"b"<<" ";
		}
		if(j%n==0&&j){
			//cout<<"c"<<" ";
			cout<<endl;
		}
	}

蓝色回归!

全体代码:

#include<bits/stdc++.h>
using namespace std;
int a[10001],n;
int main(){
	cin>>n;
	int sum1=0,sum2=0;//sum2是后来加的 
	for(int i=1;;i++){
		cin>>a[i];
		sum1+=a[i];
		sum2++;
		if(sum1==n*n)break;
	}
	int j=0;
	for(int i=1;i<=sum2;){//试了半天的输出 
		if(a[i]){
			a[i]--;
			if(i%2==0)cout<<1;
			else cout<<0;
			//cout<<a[i]<<" "<<i<<" "<<j<<" ";
			j++;
		}
		else{
			i++;
			continue;
			//cout<<"b"<<" ";
		}
		if(j%n==0&&j){
			//cout<<"c"<<" ";
			cout<<endl;
		}
	}
	return 0;
} 

我是大白,每日一更,记得关注!!!(这篇昨天忘发了,好尴尬)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值