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