洛谷

P1319 压缩技术

题目地址:https://www.luogu.com.cn/problem/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= 交替的各位数之和)

代码如下:

#include<iostream>
using namespace std;

// 全局变量声明
int n;          // 用于存储方阵的阶数(n x n)
int s = 1;      // 用于记录当前已输出的元素个数,初始化为1
int a;          // 用于临时存储每次输入的数值
int i = 1;      // 用于记录当前处理的输入数据序号(从1开始)

int main()
{
    // 读取方阵的阶数n,后续将输出一个n×n的方阵
    cin >> n;

    // 循环条件:只要已输出的元素个数s不超过n×n(方阵总元素数),就继续循环
    while (s <= n * n)
    {
        // 读取一个整数a,表示当前要输出a个相同的数字(0或1)
        cin >> a;

        // 循环a次,每次输出一个数字(0或1)
        for (int j = 1; j <= a; j++)
        {
            // 判断当前输入数据的序号i是奇数还是偶数
            // 如果i是奇数,输出0;如果i是偶数,输出1
            if (i % 2 == 1)
                cout << 0;
            else 
                cout << 1;

            // 每输出n个元素后换行(完成一行的输出)
            if (s % n == 0)
            {
                cout << endl;
            }

            // 已输出元素个数加1
            s++;
        }

        // 处理完当前输入数据后,序号i加1,准备处理下一个输入数据
        i++;
    }

    return 0;
}

方法二:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,sum=0,cnt=0,k=0;
    cin >> n;
    while(sum<n*n)
    {
        int x;
        cin >> x;
        k++;
        while(x--)
        {
            if(cnt==n)
            {
                cout<<endl;
                cnt=0;
            }
            cout<<!(k%2);
            cnt++,sum++;
        }
    }
    return 0;
}