题目描述
设某汉字由 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