题目链接:4237.擅长C
思路
根据题意,每个单词的每个字母要按照矩阵输出,所以我们要思考:怎么找到每个单词?怎么让每个单词按照矩阵输出?
找单词:遇到大写字母就将其连接上word,否则输出单词,输出之后将word清空!
单词输出:一个单词最后输出都是7行,但是列就是每个字母顺序输出。每个字母都是5列+空列,所以我们用for循环,i表示单词字母下标,j表示行,k表示列,i6+k就可以表示出每个字母的字母区域,并且进行赋值,而空行就更容易了,就是i6-1(i从1开始),然后每个单词一行一行输出。
要注意换行的问题,第一个单词输出时开头没有换行,而后面的单词输出都有,所以设置一个全局布尔变量,保证第一个单词输出时没有换行。
AC代码
#include <iostream>
using namespace std;
char s[26][7][6];//例如a[1][2][3]意思是:字母B的第3行第4列对应的字母
bool is_first = true;//输出一个单词之前要换行(除了第一个单词)
void output(string word)
{
if (word.empty()) return; //特判,可能为空
if (is_first) is_first = false;
else cout << endl;
char str[7][60] = {0};
for (int i = 0; i < word.size(); i++)
for (int j = 0; j < 7; j++)
for (int k = 0; k < 5; k++)
str[j][i * 6 + k] = s[word[i] - 'A'][j][k];//给字母区域赋值
for (int i = 1; i < word.size(); i++)
for (int j = 0; j < 7; j++)
str[j][i * 6 - 1] = ' ';//空格赋值
for (int i = 0; i < 7; i++)
cout << str[i] <<endl;//按行输出
}
int main()
{
for (int i = 0; i < 26; i++)
for (int j = 0; j < 7; j++)
cin >> s[i][j];
char c;
string word;
while ((c = getchar()) != -1)
{
if (c >= 'A' && c <= 'Z') word +=c;
else //找到每个单词
{
output(word);
word = "";//一个单词输出后,将word置为空,找新的单词
}
}
output(word);//可能最后一个字符也是字母,所以while循环中没有输出最后一个单词,这里就是避免这个问题
return 0;
}