P1320 压缩技术(续集版)
压缩技术(续集版)
题目描述
设某汉字由 N × N N \times N N×N 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 0 \texttt 0 0,第二个数表示接下来连续有几个 1 \texttt 1 1,第三个数再接下来连续有几个 0 \texttt 0 0,第四个数接着连续几个 1 \texttt 1 1,以此类推……
例如: 以下汉字点阵图案:
0001000
0001000
0001111
0001000
0001000
0001000
1111111
对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 \texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7} 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是 N N N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N = N \times N= N×N= 交替的各位数之和)
输入格式
汉字点阵图(点阵符号之间不留空格)。
输出格式
输出一行,压缩码。
样例 #1
样例输入 #1
0001000
0001000
0001111
0001000
0001000
0001000
1111111
样例输出 #1
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
提示
数据保证, 3 ≤ N ≤ 200 3\leq N\leq 200 3≤N≤200。
分析:
使用数组a储存字点阵图案,因为有换行,所以用strcat函数把它们放在一起;
#include<stdio.h>
#include<string.h>
#include<math.h>
char a[40005], b[205];//在全局定义,默认值为’\0’
int main()
{
int i = 0, n, count = 1;
scanf("%s", b);
n = strlen(b);
strcat(a, b);//将b连接到a后;
for (i = 1; i < n; i++)//因为已经连接第一个了,因此循环从第二行字符开始
{
scanf("%s", b);
strcat(a, b);//输入并连接
}
printf("%d ", n);//输出n值,每个输出后带上空格
if (a[0] == '1')//坑点:题目要求压缩码第一位(除去n)为表示有字点阵图案一开始有多少零,若一开始没有0,则第一位为0;
printf("0 ");
for (i = 0; i < strlen(a) - 1; i++)
{
if (a[i] == a[i + 1])//判断这个字符是否与下一个字符相等
count++;//如果相等,count+1;
else
{
printf("%d ", count);//如果不相等,则打印count;
count = 1;//重置
}
}
//printf("%d\n", count);//莫忘最后,没有不相等的条件了,所以要额外打印
return 0;
}