题解:洛谷 P1320 压缩技术(续集版)
【题目来源】
【题目描述】
设某汉字由 \(N\times N\) 的 \(0\) 和 \(1\) 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 \(0\),第二个数表示接下来连续有几个 \(1\),第三个数再接下来连续有几个 \(0\),第四个数接着连续几个 \(1\),以此类推……
例如: 以下汉字点阵图案:
0001000
0001000
0001111
0001000
0001000
0001000
1111111
对应的压缩码是\(7\ 3\ 1\ 6\ 1\ 6\ 4\ 3\ 1\ 6\ 1\ 6\ 1\ 3\ 7\) (第一个数是 ,其余各位表示交替表示 \(0\) 和 \(1\) 的个数,压缩码保证 \(N\times N=\) 交替的各位数之和)
【输入】
汉字点阵图(点阵符号之间不留空格)。
【输出】
输出一行,压缩码。
【输入样例】
0001000
0001000
0001111
0001000
0001000
0001000
1111111
【输出样例】
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
【算法标签】
《洛谷 P1320 压缩技术(续集版)》 #模拟# #字符串# #洛谷原创#
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
int ans[40005]; // 定义全局数组:存储连续相同字符的计数
int main()
{
char c; // 定义变量:当前读取的字符
char lastC = '0'; // 定义变量:上一个字符(初始化为'0')
int len = 0; // 定义变量:输入字符总长度
int cnt = 0; // 定义变量:连续段计数器
// 循环读取输入字符
while (cin >> c)
{
len++; // 总字符数加1
// 判断当前字符是否与上一个字符相同
if (c == lastC)
{
ans[cnt]++; // 相同则当前连续段计数加1
}
else
{
cnt++; // 不同则创建新连续段
ans[cnt] = 1; // 新连续段计数初始化为1
lastC = c; // 更新上一个字符为当前字符
}
}
// 输出总字符数的平方根(题目特殊要求)
cout << sqrt(len);
// 输出各连续段的字符数
for (int i = 0; i <= cnt; i++)
{
cout << ' ' << ans[i]; // 用空格分隔输出各段计数
}
return 0; // 程序正常结束
}
【运行结果】
0001000
0001000
0001111
0001000
0001000
0001000
1111111
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
浙公网安备 33010602011771号