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('\n');
    }
    return 0;
}
posted @ 2019-09-15 20:48  zifeiynoip  阅读(524)  评论(0编辑  收藏  举报