洛谷 P1320 压缩技术 (续集版)题解
先上题目传送门
接下来是枯燥的题目介绍
压缩技术 (续集版)
设某汉字由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
0001000 0001000 0001111 0001000 0001000 0001000 1111111
输出样例 #1
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
emmm,接下来我说一说思路,我准备先定义一个一维的字符类型的数组,这个数字用来存输入的东西,接下来用无限(无限输入就是指使用while循环的方式cin)输入的方式输入这些字符,接下来定义两个计数变量,第一个计数变量表示连续1和0出现的个数,第二个计数变量表示这个输入正方形的边长.然后无限输入,每次把第二个计数变量加一,接下来输出第二个计数变量开方后的结果.然后再来一个循环,每次判断字符串中的第i个字符是否是一或者零,如果是,那么第一个循环变量加一;如果不是,那么输出此时的第一个循环变量,然后把这第一个循环变量变成一,经过这一系列的循环之后,再把最后的第一个计数变量输出就可以了(因为这个计数变量在最后的时候并没有输出).最后只要注意每次输出的时候再加一个空格就行.
上代码!!
#include <cstdio> #include <iostream> #include <cmath> using namespace std; int main(){ char tmp[40005];//输入的字符串
int cnt1=0/*第一个计数变量*/,cnt=0;//第二个计数变量 char flag='0';//判断是否等于是要用 while(cin>>tmp[cnt]) cnt++;//无限输入 cout<<(int)sqrt(cnt)<<" ";//输出正方形边长 for(int i=0;i<cnt;i++){//遍历每个字符 if(tmp[i]==flag){//判断是否相等 cnt1++;//如果相等则cnt1++ }else{//如果不相等 cout<<cnt1<<" ";//输出cnt1 cnt1=1;//归一 if(flag=='0') flag='1';//flag变换 else if(flag=='1') flag='0';//flag变换 } } cout<<cnt1;//最后补上输出 return 0; }
谢谢大家!

浙公网安备 33010602011771号