zoukankan      html  css  js  c++  java
  • 9.2练习题4 压缩技术 题解

    题目出处:洛谷 P1319

    题目描述

    设某汉字由N × 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 (第一个数是N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N=交替的各位数之和)

    输入格式

    一行,压缩码。

    输出格式

    汉字点阵图(点阵符号之间不留空格)。(3<=N<=200)

    样例输入

    7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
    

    样例输出

    0001000
    0001000
    0001111
    0001000
    0001000
    0001000
    1111111
    

    题目分析

    这道题目是一道标准的模拟题。
    首先,行和列都不超多200,所以我们开一个比40000大一些的数组存放我们的结果,
    其中, (res[i]) 表示第 i/n 行第 i%n 列所存放的数(1或0)。
    并且我们定义一个变量 cnt 用于表示当前已经在 res 数组中存放的元素的个数,开一个变量 flag 表示接下来应该存放的是 1 还是 0。
    然后我们每次读入一个数 a ,我们就循环 a 次执行 (res[cnt++] = flag;) ,并且在循环结束的时候执行 (flag = !flag;) 。这样,我们就能够保证将我们输入的数据存储到 res 数组中,最后通过 res 数组来还原我们的点阵图案就可以了。
    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 202 * 202;
    int n, a, res[maxn], cnt, flag;
    int main() {
        cin >> n;
        while (cin >> a) {
            while (a --) {
                res[cnt++] = flag;
            }
            flag = !flag;
        }
        for (int i = 0; i < n*n; i ++) {
            cout << res[i];
            if ((i+1) % n == 0) putchar('
    ');
        }
        return 0;
    }
    
  • 相关阅读:
    简单说说 Java 的 JVM 内存结构
    cpu怎么实现运算的
    triplet
    LCT的一些坑【已经变成坑点集合了233】
    插头DP学习笔记
    一个坑-卡常
    NOIP2017游记
    洛谷P4015 运输问题
    线性基学习笔记
    洛谷P4331[BOI2004] sequence
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11524138.html
Copyright © 2011-2022 走看看