P1320 压缩技术(续集版)

· · 个人记录

题目:P1320 压缩技术(续集版)

思路:先将输入的点阵图存在一个字符串a里,再遍历字符串,判断 a[i] 以及 a[i - 1] 是'0'还是'1',从而判断是否发生变号,不变号就对应的计数变量+1,变号就计数变量+1、输出计数变量、且将计数变量归零,计数变量就是cnt0、cnt1。特别的,a第一个数和最后一个数需要特殊处理。

代码:

#include <iostream>
using namespace std;

string a, x;  // a:将所有数存入a中,x:暂存一行一行输入用。

int cnt = 0, cnt0 = 0, cnt1 = 0;  // cnt0:记录'0'个数, cnt1:记录'1'个数

int main()
{
    while (cin >> x)
    {
        a += x;  // 每行输入都存入a 
        cnt++;  // 记录输入几行,即N的值。 
    }

    cout << cnt << " ";  // 压缩码第一个值 

    // 遍历a,'0'就cnt0++,'1'就cnt1++
    // 如果'0'->'1'或者'1'->'0'发生变号,就输出cnt0或者cnt1 
    for (int i = 0; i < a.size(); i++)
    {
        if (i == 0)  // 特别处理第一个数 
        {
            if (a[0] == '0') cnt0++;
            if (a[0] == '1')
            {
                // 压缩码第二个值必须是0的个数,如果点阵图第一个是1,则压缩码第二个值输出0,即0的个数是0
                cout << "0 "; 
                cnt1++;
            }
        }
        else
        {
            if (a[i] == '0' && a[i - 1] == '0')
            {
                cnt0++;
            }
            if (a[i] == '0' && a[i - 1] == '1')
            {
                cnt0++;
                cout << cnt1 << " ";
                cnt1 = 0;
            }
            if (a[i] == '1' && a[i - 1] == '0')
            {
                cnt1++;
                cout << cnt0 << " ";
                cnt0 = 0;
            }
            if (a[i] == '1' && a[i - 1] == '1')
            {
                cnt1++;
            }
            if (i == a.size() - 1)  // 输出最后一个压缩码 
            {
                if (a[i] == '0') cout << cnt0;
                if (a[i] == '1') cout << cnt1;
            }
        }
    }

    return 0;
}