P1320 压缩技术(续集版)

# 压缩技术(续集版)

## 题目描述

设某汉字由 $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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值