# 压缩技术(续集版)
## 题目描述
设某汉字由 $N \times N$ 的 $\texttt 0$ 和 $\texttt 1$ 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 $\texttt 0$,第二个数表示接下来连续有几个 $\texttt 1$,第三个数再接下来连续有几个 $\texttt 0$,第四个数接着连续几个 $\texttt 1$,以此类推……
例如: 以下汉字点阵图案:
```
0001000
0001000
0001111
0001000
0001000
0001000
1111111
```
对应的压缩码是: $\texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7}$ (第一个数是 $N$ ,其余各位表示交替表示0和1 的个数,压缩码保证 $N \times 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\leq N\leq 200$。
#include <stdio.h>
#include <string.h>
int main(void)
{
int i = 0; // 循环必备的变量
int N = 0; // 一行字符串的长度
int sum = 0; // 0或1的总个数
char ch = '0'; // 用来存储每一次数组内每个元素所要比较的对象
char str1[40000] = {0}; // 存放总的字符串
char str2[200] = {0}; // 存放每一行字符串
scanf("%s", str2); // 输入第一行,以确定N
N = strlen(str2); // N等于第一行字符串的长度
strcat(str1, str2); // 该函数类似Linux的cat命令,把一个字符串接到另一个字符串的末尾
for (i = 2; i <= N; i++) // 输入第2~N行字符串
{
scanf("%s", str2);
strcat(str1, str2); // 将输入的每个字符串接到总字符串上
}
printf("%d ", N); // 打印出N的值
for (i = 0, sum = 0; i <= N * N; i++) // “<=”是为了打印出最后一个值
{ // 因为字符串以\0结尾,必与前面的值不同,从而把最后一个值打印
if (ch == str1[i]) // 相同就++
sum++;
else
{
ch = str1[i]; // 不相同就把那个不相同的值赋给它
printf("%d ", sum); // 打印出sum的值
sum = 1; // 将sum重新定义为1,因为这个不同的字符也算一个
}
}
return 0;
}