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.题目分析

考虑用字符串,一行一行输入是比较方便的。
然后就是判断输出零和一的个数。
题意大概是:输入一个由零,一组成的点阵,第一位数打印点阵的阶数,
后面依次统计连续零和一的交替个数。
值得一提的是,题目要求的第一次必须是零的连续个数,所以需要在第一次非零输入时,做一个特判。

2.题目思路

由于给的输入案例是,按行输入的,所以定义一个临时字符串,读每一行,
在循环中,再定义一个足够大的数组,将所有元素存在一个一维数组里。
值得一提的是,循环跳出的条件是:当行数等于列数(即临时字符串的数组长度)。

打印行数或者列数,即是阶数。

遍历装有所有元素的数组,设计一个标志变量flag,
判断第一个数,如果是0,flag为0,反之flag为1,
如若是第一轮循环,还需要打印零(满足题目要求)。
统计数加一,
如果下一个元素是1,且flag为0,则交替flag,打印sum(即0的个数),并重置为0。
如果下一个元素是零,且flag为1,则交替flag,打印sum(即1的个数),并重置为0。
值得注意的是,需要对最后一组数据的个数进行特判,利用字符串的结束符:'\0’进行判断。

3.代码演示

#include 
#include 

int main() {
    char arr[200] = {0};
    char res[100000] = {0};
    int count = 0;
    int index = 0;
    while (true) {
        //读到每一行字符
        scanf("%s", arr);
        for (int i = 0; i < strlen(arr); ++i) {
            //将所有字符存到一个数组里
            res[index] = arr[i];
            index++;
        }
        count++;
        //当行数等于列数,跳出循环
        if (count == strlen(arr)) {
            break;
        }
    }
    //打印阶数
    printf("%d ", count);
    int sum = 0;
    int flag = 0;
    for (int i = 0; i < strlen(res); ++i) {
        //判断第一个数,标记
        if (res[i] == '0') {
            flag = 0;
        } else {
            //特判:题目要求第一次输入必须表示几个零,所以非零情况需要打印一次零
            if (i == 0) {
                printf("0 ");
            }
            flag = 1;
        }
        sum++;
        //如果下一个元素是1,且flag为0,则交替flag,打印sum(即0的个数),并重置为0
        if (res[i + 1] == '1' && flag == 0) {
            flag = 1;
            printf("%d ", sum);
            sum = 0;
        }
        //如果下一个元素是零,且flag为1,则交替flag,打印sum(即1的个数),并重置为0
        if (res[i + 1] == '0' && flag == 1) {
            flag = 0;
            printf("%d ", sum);
            sum = 0;
        }
        //打印最后一组数据的个数
        if (res[i + 1] == '\0') {
            printf("%d", sum);
        }
    }

    return 0;
}

你可能感兴趣的:(刷题go,go,go,算法,数据结构)