c++ - 将 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);
}
任何帮助将不胜感激,我不知道该怎么做。
解决方案
假设字符数据如下所示:
#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;
}
推荐阅读
- c# - StreamReader 无法从引用的程序集中读取代码的 FileStream
- .net-core - .net core 2.0+ 的 rdlc 报告替代方案
- javascript - 使用javascript合并行
- reactjs - 如何为 react-typist 或其他包创建声明文件
- r - 使用 EndNote (.enl) 库在 R Markdown 中引用的引用 ID 是什么?
- angular - 遍历对象中的数组参数
- r - ZendeskR 尝试连接 api 时产生以下错误
- php - 如何知道我是否使用了作曲家依赖项?
- python - 将多个变量分配给函数
- c++ - 当先调用 Remove_All_Sinks() 时,提升日志设置轮换和最大文件大小导致添加第二个接收器