首页 > 解决方案 > 将 8x4 矩阵转换为由 5x5 模式组成的 40x20

问题描述

我必须将 8 x 4 二维字符数组转换为 40 x 20 二维数组 {0,1},原始数组的每个单元格都是从 A 到 F 的字母,代表 { 0,1) 在 5x5 中,这有点难以描述,所以我将向您展示我的意思:

  F  D  A  E
  E  F  F  C
  A  A  C  C
  C  C  E  B
  B  B  B  A
  A  C  F  A
  A  C  C  B
  A  A  E  E

each letter represents a 5x5 array of given combination that looks for example like this(This is the "F" variant)

0 0 1 0 0
0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0

转换后,40 x 20 数组将是 int 类型,并且仅包含 {0,1} 这是我目前的代码:

void MacierzSegmentow(char MacierzPosegmentowana[Wymiar8][Wymiar4])
{
    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 4; j++)
            MacierzPosegmentowana[i][j] = char(rand() % 6 + 65);
}

任何帮助将不胜感激,我不知道该怎么做。

标签: c++arraysmatrix

解决方案


假设字符数据如下所示:

#define CHAR_DATA_WIDTH  5
#define CHAR_DATA_HEIGHT 5
#define CHAR_DATA_SIZE   6
int character_data[CHAR_DATA_SIZE][CHAR_DATA_HEIGHT][CHAR_DATA_WIDTH] = {
    {...}, // data for 'A'
    {...}, // data for 'B'
    {...}, // data for 'C'
    {...}, // data for 'D'
    {...}, // data for 'E'
    {...}, // data for 'F'
};

然后,如果您的输入和输出如下所示:

#define INPUT_DATA_WIDTH  4
#define INPUT_DATA_HEIGHT 8
char input_data[INPUT_DATA_HEIGHT][INPUT_DATA_WIDTH] = {
  {'F',  'D',  'A',  'E'},
  {'E',  'F',  'F',  'C'},
  {'A',  'A',  'C',  'C'},
  {'C',  'C',  'E',  'B'},
  {'B',  'B',  'B',  'A'},
  {'A',  'C',  'F',  'A'},
  {'A',  'C',  'C',  'B'},
  {'A',  'A',  'E',  'E'},
};

#define OUTPUT_DATA_WIDTH  INPUT_DATA_WIDTH*CHAR_DATA_WIDTH
#define OUTPUT_DATA_HEIGHT INPUT_DATA_HEIGHT*CHAR_DATA_HEIGHT
int output_data[OUTPUT_DATA_HEIGHT][OUTPUT_DATA_WIDTH] = {};

然后您可以使用它一次转换输入中的每个字符:

void ConvertInputToOutput()
{
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            CopyCharacterToOutput(x*CHAR_DATA_WIDTH,y*CHAR_DATA_HEIGHT,input_data[y][x]);
}

CopyCharacterToOutput 的前两个参数是输出数据中应放置字符数据的位置。第三个参数是要在该位置放入输出的字符。

您可以使用它来将适当的字符数据复制到输出:

void CopyCharacterToOutput(int start_x, int start_y, char character)
{
    for(int y=0;y<CHAR_DATA_HEIGHT;y++)
        for(int x=0;x<CHAR_DATA_WIDTH;x++)
            output_data[y+start_y][x+start_x] = character_data[character-'A'][y][x];
}

output_data 需要偏移起始位置,传入的字符需要从字符转换为数组索引。

把它们放在一起,我们得到这个:

#include <stdio.h>

#define CHAR_DATA_WIDTH  5
#define CHAR_DATA_HEIGHT 5
#define CHAR_DATA_SIZE   6
int character_data[CHAR_DATA_SIZE][CHAR_DATA_HEIGHT][CHAR_DATA_WIDTH] = {
    // A
    {
        {0,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,1},
        {1,0,0,0,1},
        {1,0,0,0,1},
    },
    // B
    {
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,0},
    },
    // C
    {
        {0,1,1,1,1},
        {1,0,0,0,0},
        {1,0,0,0,0},
        {1,0,0,0,0},
        {0,1,1,1,1},
    },
    // D
    {
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,0,0,0,1},
        {1,0,0,0,1},
        {1,1,1,1,0},
    },
    // E
    {
        {1,1,1,1,1},
        {1,0,0,0,0},
        {1,1,1,1,0},
        {1,0,0,0,0},
        {1,1,1,1,1},
    },
    // F
    {
        {1,1,1,1,1},
        {1,0,0,0,0},
        {1,1,1,1,0},
        {1,0,0,0,0},
        {1,0,0,0,0},
    },
};

#define INPUT_DATA_WIDTH  4
#define INPUT_DATA_HEIGHT 8
char input_data[INPUT_DATA_HEIGHT][INPUT_DATA_WIDTH] = {
  {'F',  'D',  'A',  'E'},
  {'E',  'F',  'F',  'C'},
  {'A',  'A',  'C',  'C'},
  {'C',  'C',  'E',  'B'},
  {'B',  'B',  'B',  'A'},
  {'A',  'C',  'F',  'A'},
  {'A',  'C',  'C',  'B'},
  {'A',  'A',  'E',  'E'},
};

#define OUTPUT_DATA_WIDTH  INPUT_DATA_WIDTH*CHAR_DATA_WIDTH
#define OUTPUT_DATA_HEIGHT INPUT_DATA_HEIGHT*CHAR_DATA_HEIGHT
int output_data[OUTPUT_DATA_HEIGHT][OUTPUT_DATA_WIDTH] = {};

void CopyCharacterToOutput(int start_x, int start_y, char character)
{
    for(int y=0;y<CHAR_DATA_HEIGHT;y++)
        for(int x=0;x<CHAR_DATA_WIDTH;x++)
            output_data[y+start_y][x+start_x] = character_data[character-'A'][y][x];
}

void ConvertInputToOutput()
{
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            CopyCharacterToOutput(x*CHAR_DATA_WIDTH,y*CHAR_DATA_HEIGHT,input_data[y][x]);
}

void PrintInput()
{
    printf("Input: \n\n");
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
    {
        printf("  ");
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            printf(" %c",input_data[y][x]);
        printf("\n");
    }
    printf("\n");
}

void PrintOutput()
{
    printf("Output: \n");
    for(int y=0;y<OUTPUT_DATA_HEIGHT;y++)
    {
        if (y%CHAR_DATA_HEIGHT == 0)
            printf("\n");
        printf("  ");
        for(int x=0;x<OUTPUT_DATA_WIDTH;x++)
        {
            if (x%CHAR_DATA_WIDTH == 0)
                printf(" ");
            printf(" %d",output_data[y][x]);
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    PrintInput();
    ConvertInputToOutput();
    PrintOutput();

    return 0;
}

在https://onlinegdb.com/HyLwVkw7u尝试一下


推荐阅读