题目描述
设某汉字由 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个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交替的各位数之和)
## 输入格式
汉字点阵图(点阵符号之间不留空格)。
## 输出格式
输出一行,压缩码。
### 样例输入 #1
0001000
0001000
0001111
0001000
0001000
0001000
1111111
### 样例输出
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
## 提示
数据保证,3 < n < 200
代码展示
#include <stdio.h>
#include <string.h>
int main() {
int n = 0;
char first_line[201];
scanf("%s", first_line);
int digit = strlen(first_line);
int (*numbers)[digit] = calloc(digit * digit, sizeof(int));
if (numbers == NULL)
{
perror("error memory allo");
return 1;
}
for (int i = 0; i < digit; i++)
{
numbers[0][i] = first_line[i] - '0';
}
for (int i = 1; i < digit ; i ++)
{
char *lines = calloc(201, sizeof(lines));
scanf("%s", lines);
for (int j = 0; j < digit; j++)
{
numbers[i][j] = lines[j] - '0';
}
free(lines);
}
int verify_number = 0;
int *counter = calloc(digit * digit, sizeof(int));
for (int i = 0; i < digit; i++) counter[i] = 0;
int index = 0;
for (int i = 0; i < digit; i++) {
for (int j = 0; j < digit; j++) {
if (numbers[i][j] == verify_number) {
counter[index]++;
} else if (numbers[i][j] != verify_number) {
verify_number = numbers[i][j];
index++;
counter[index]++;
}
}
}
printf("%d ", digit);
for (int i = 0; i <= index; i++)
{
printf("%d ", counter[i]);
}
return 0;
}
ai优化版本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 201
void compress_image(int (*numbers)[MAX_SIZE], int digit, int *counter, int *index) {
int verify_number = 0;
*index = 0;
for (int i = 0; i < digit; i++) {
for (int j = 0; j < digit; j++) {
if (numbers[i][j] == verify_number) {
counter[*index]++;
} else {
verify_number = numbers[i][j];
(*index)++;
counter[*index] = 1;
}
}
}
}
int main() {
char first_line[MAX_SIZE];
if (fgets(first_line, MAX_SIZE, stdin) == NULL) {
perror("Error reading input");
return 1;
}
int digit = strlen(first_line) - 1; // -1 to remove newline
int (*numbers)[MAX_SIZE] = calloc(digit, sizeof(*numbers));
if (numbers == NULL) {
perror("Error allocating memory");
return 1;
}
for (int i = 0; i < digit; i++) {
numbers[0][i] = first_line[i] - '0';
}
for (int i = 1; i < digit; i++) {
if (fgets(first_line, MAX_SIZE, stdin) == NULL) {
perror("Error reading input");
free(numbers);
return 1;
}
for (int j = 0; j < digit; j++) {
numbers[i][j] = first_line[j] - '0';
}
}
int counter[MAX_SIZE * MAX_SIZE] = {0};
int index = 0;
compress_image(numbers, digit, counter, &index);
printf("%d ", digit);
for (int i = 0; i <= index; i++) {
printf("%d ", counter[i]);
}
free(numbers);
return 0;
}