U730815 等反转
题目背景
凌晨 3:17,实验室只剩你和一块发热的 STM32。学长突然发来一个文件:
真的最终版_别改了.bin
并留言:
“OLED 显示反了,帮我把矩阵转置一下,十分钟能搞定吧?”
你以为是文本文件,打开一看全是乱码;切到十六进制查看器,才发现它根本不是什么带格式的文本,而是实习生直接 fwrite 出来的原始二进制内存镜像。没有文件头,没有地址,没有校验和,只有一连串 00 到 FF 的字节。
文件按行优先保存了一个 n × m 矩阵。每个元素占两个字节,小端序:第一个字节是低 8 位,第二个字节是高 8 位,拼成一个 int16_t。也就是说,FE FF 不是 65534,是 -2;00 80 也不是 32768,是 -32768。
更离谱的是,上位机把行列读反了,导致原本 n 行 m 列的矩阵显示成了 m 行 n 列,画面像被门夹过又拧了 90 度。
现在你要做的,就是从这堆裸字节里还原出矩阵,把它转置,然后按格式输出。不过好消息是你找到了前人留下的一部分程序,不过还是缺了一部分找不到了必须你来补全了(程序在最下面)。
板子可以烧,数据不能错。 低字节在前,高字节在后;负数是补码,不是无符号。 开始转置吧。
#include <stdio.h>
#define MAX_SIZE 1000
typedef short int16_t;
typedef unsigned char uint8_t;
// 你需要实现这两个函数
void combine_bytes(uint8_t *data, int size, int16_t *combined); // 将两个uint8_t组合成一个int16_t
void transpose(int16_t *input, int16_t *output, int n, int m); // 转置矩阵
int main(void) {
static uint8_t data[2 * MAX_SIZE * MAX_SIZE];
static int16_t input[MAX_SIZE * MAX_SIZE];
static int16_t output[MAX_SIZE * MAX_SIZE];
int n, m;
int i, j;
if (scanf("%d%d", &n, &m) != 2) return 0;
if (n < 1 || n > MAX_SIZE || m < 1 || m > MAX_SIZE) return 0;
for (i = 0; i < n; ++i) {
for (j = 0; j < m; ++j) {
int low, high;
if (scanf("%d%d", &low, &high) != 2) return 0;
data[i * m * 2 + j * 2] = (uint8_t)low;
data[i * m * 2 + j * 2 + 1] = (uint8_t)high;
}
}
combine_bytes(data, n * m * 2, input);
transpose(input, output, n, m);
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
unsigned short bits = (unsigned short)output[i * n + j];
if (j != 0) putchar(' ');
printf("%u %u", (unsigned)(bits & 0xFF),
(unsigned)((bits >> 8) & 0xFF));
}
putchar('\n');
}
return 0;
}题目描述
给定两个正整数 n 和 m,表示原始矩阵有 n 行 m 列。
接下来给出 n × m × 2 个 0 到 0xFF 之间的整数,按行优先顺序排列,表示每个矩阵元素的两个字节。对于每个元素,第一个字节是低 8 位,第二个字节是高 8 位,采用小端序拼成一个 16 位有符号整数(int16_t)。
请将得到的 n 行 m 列矩阵转置,变成 m 行 n 列,并按格式输出。
输入格式
第一行包含两个整数 n 和 m,满足 1 ≤ n, m ≤ 100。
第二行开始包含 n × m × 2 个整数,每个整数在 0 到 255 之间,可能跨多行,用空格或换行分隔。
输出格式
输出共 m 行,每行 n 个整数,表示转置后的 int16_t 矩阵。
同一行相邻整数之间用一个空格隔开,行末不能有多余空格。
输入输出样例 #1
输入 #1
2 3
1 0 2 0 3 0
4 0 5 0 6 0
输出 #1
1 4
2 5
3 6
输入输出样例 #2
输入 #2
1 2
255 255 0 128
输出 #2
-1
-32768
说明/提示
本题为交互题,不需要实现整个程序,只需要完成下面两个函数,不要写main函数!!!函数名与参数必须一致!!!
void combine_bytes(uint8_t *data, int size, int16_t *combined);
void transpose(int16_t *input, int16_t *output, int n, int m);