https://www.thehuxley.com/problem/408
Acho que compliquei demais a minha solução para esse problema e, portanto, se você pensou em algo mais simples, por favor, me avise para que eu troque aqui no site. Enquanto isso, vou falar de como resolvi.
O problema pede para implementar um visor de LCD. A forma como nos números são exibidos é mostrada no exemplo, ainda na descrição do problema. O grande desafio é encontrar uma maneira de amplificar os números para mostrar na tela. Pensei em criar uma espécie de gabarito de cada número considerando ele com tamanho 1. E então gastei um bom tempo pensando em uma maneira de ampliar esse gabarito para qualquer tamanho.
Então, resolvi representar esse gabarito como uma matriz, onde 1 representa o traço deitado e o 2 representa o traço em pé. Desta forma, o número 3, por exemplo, seria representado da seguinte maneira:
// 3
{0,1,0},
{0,0,2},
{0,1,0},
{0,0,2},
{0,1,0}
Para criar essa matriz, tive que olhar para o exemplo de saída do problema, que nesse caso já mostra os números amplificados para os tamanhos 2 e 3, e imaginar como seriam esses números com o tamanho 1. Depois disso, como fazer para a partir desse gabarito ampliá-lo para qualquer tamanho?
Comecei a desenhar no papel alguns números em vários tamanhos diferentes para identificar algum padrão e percebi o seguinte:
Com base nessas observações, escrevi uma função que faz a ampliação. Nesse caso, eu já preencho uma matriz de caracteres para representar a ampliação de cada número. Nesse ponto, já conseguimos ampliar cada número, mas o problema dá como entrada vários números. Logo, precisaremos concatenar as várias ampliações dos números dados. Para fazer isso, criei um array de strings e fiz algumas concatenações:
...
char lcd_number[MAX_LINES][MAX_COLUMNS];
...
string answer[MAX_LINES];
...
// para cada número que vai ser ampliado, executo o loop abaixo:
// função que faz a ampliação e guarda o resultado em lcd_number
generate_number(number - '0',size,lines,columns, lcd_number);
for (int i=0 ; i< lines ; i++)
{
if (first)
{
answer[i] = string(lcd_number[i]);
}
else
{
answer[i] = answer[i] + " "+ string(lcd_number[i]);
}
}
Essa questão é interessante para exercitar a manipulação de strings em C++, relembrar o memset e arrays (uni e bidimensionais).