当前位置: 首页 > news >正文

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 <stdio.h>
#include <string.h>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的个数),并重置为0if (res[i + 1] == '1' && flag == 0) {flag = 1;printf("%d ", sum);sum = 0;}//如果下一个元素是零,且flag为1,则交替flag,打印sum(即1的个数),并重置为0if (res[i + 1] == '0' && flag == 1) {flag = 0;printf("%d ", sum);sum = 0;}//打印最后一组数据的个数if (res[i + 1] == '\0') {printf("%d", sum);}}return 0;
}
http://www.lryc.cn/news/112038.html

相关文章:

  • k8s(七) 叩丁狼 service Ingress
  • Android Studio 关于BottomNavigationView 无法预览视图我的解决办法
  • 【STM32】小电流FOC驱控一体板(开源)
  • 代码分析:循环创建N个子进程——为什么最后一个属于父进程?
  • 【SpringBoot面试题整理-超级有效】
  • 岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测
  • 西瓜书读书笔记整理(五)—— 第四章 决策树
  • STM32 4G学习
  • Golang 中实现实时聊天通讯
  • 前端面试的性能优化部分(5)每天10个小知识点
  • 【链表OJ 1】移除链表元素val
  • 复原 IP 地址——力扣93
  • OSPF综合实验
  • 安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案
  • Linux 匿名页的生命周期
  • 设计模式概述与UML图
  • 使用Vscode编辑keil工程
  • 编译工具:CMake(一) | 简介与安装
  • 深度学习(34)—— StarGAN(1)
  • ES6系列之let、const、箭头函数使用的坑
  • 4.DNS和负载均衡
  • 【JavaEE进阶】Spring核心与设计思想
  • 实习周记第三周
  • 11. 使用tomcat中碰到的一些问题
  • C++解决TCP粘包
  • 最长快乐前缀——力扣1392
  • 使用java.util.List的containsAll()方法可能导致的问题
  • 在线文本转语音播放 (TTS)
  • OPTEE之ARM安全扩展
  • Vue [Day4]