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;
}