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