P1320 压缩技术(续集版)
xiufanivan · · 个人记录
题目: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;
}