洛谷之P1319 压缩技术

题目描述

设某汉字由 N×N 的 0 和 1 的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 00,第二个数表示接下来连续有几个 11,第三个数再接下来连续有几个 00,第四个数接着连续几个 11,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 77 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是 N ,其余各位表示交替表示0和1 的个数,压缩码保证 N×N= 交替的各位数之和)

输入格式

数据输入一行,由空格隔开的若干个整数,表示压缩码。

其中,压缩码的第一个数字就是 N,表示这个点阵应当是 N×N 的大小。                 

接下来的若干个数字,含义如题目描述所述。

输出格式

输出一个 N×N 的 01 矩阵,表示最后的汉字点阵图(点阵符号之间不留空格)。


题解

分析

首先需要一个N,其次就是轮番输入0与1的个数,也就是说可以对0和1进行分堆,倘若用到数组,不符合时效性,毕竟这不是一道统计题,故设两个动参持续接受输入值。

其次将数字需要填入二维数组中,若直接以数组的方式输入或许有些麻烦,此刻我们将使用一个指针 int *p=&a[0][0];也就是说指针p 将会从第一个数字开始,一排一排地逐个吃掉。受指针的帮助,我们不需要去二维遍历整个数组。

那么如何变换0和1呢?我们如果每次判断完是否是那个数再去取对应的数字,或许是麻烦的,不妨使用位运算“异或”(避免有的码友不了解,下给出简单概括:“两个数字进行异或(运算符:^)运算,两者相同为0,不同为1”)先设一数,再在输入循环中不断进行异或运算。

下见代码!

代码

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n][n];
    int *p=&a[0][0];                    //指针的初值
    int label=0;
    int h=0,t=0;                        每一次的循环的初始状态都在变,使用t记录
    int i,j;
    while(t<n*n)                       // 0与1个数的总和应当小于方阵元素个数
    {
        cin>>h;
        for(i=t;i<h+t;i++)
        {
            *(p+i)=label;            //指针与二维数组的便捷使用
        }
        t+=h;
        label^=1;                     //异或运算的相互转换
    }
    for(i=0;i<n;i++)                    
    {
        for(j=0;j<n;j++)            //输出即可
        cout<<a[i][j];
        cout<<endl;
    }
    
    return 0;
}

至此,本题结束!

路远常逢!

输入与输出

输入

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

输出

0001000
0001000
0001111
0001000
0001000
0001000
1111111

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值