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;
    }
    
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11524138.html
Copyright © 2011-2022 走看看