Вот мой подход и решение с кодом ниже.
Подход:
Существует три отдельных операции, которые можно выполнить.
- нажатие клавиши A - выводит один символ 'A'
- нажатие клавиши (Ctrl-A) + (Ctrl-C) - по сути ничего не выводит. Эти два нажатия клавиш могут быть объединены в одну операцию, потому что каждое из этих нажатий клавиш по отдельности не имеет смысла. Кроме того, это нажатие клавиши настраивает вывод для следующей операции вставки.
- Нажатие клавиши (Ctrl-V) - Выходные данные для этого нажатия клавиши действительно зависят от предыдущей (второй) операции и, следовательно, мы должны учитывать это в нашем коде.
Теперь, учитывая три различных операции и их соответствующие выходы, мы должны пройти через все перестановки этих операций.
Предположение:
Теперь в некоторых версиях этой проблемы говорится, что последовательность нажатий клавиш Ctrl + A -> Ctrl + C -> Ctrl + V перезаписывает выделенный фрагмент. Чтобы учесть это предположение, к приведенному ниже решению необходимо добавить только одну строку кода, где для печатной переменной в случае 2 задано значение 0
.
case 2:
//Ctrl-A and then Ctrl-C
if((count+2) < maxKeys)
{
pOutput = printed;
//comment the below statement to NOT factor
//in the assumption described above
printed = 0;
}
Для этого решения
Приведенный ниже код напечатает пару последовательностей, и последняя последовательность является правильным ответом для любого заданного N., например, для N = 11 это будет правильная последовательность
С предположением
A, A, A, A, A, C, S, V, V, V, V,: 20:
Без предположения
A, A, A, C, S, V, V, C, S, V, V,: 27:
Я решил сохранить предположение для этого решения.
Легенда нажатия клавиш:
'A' - A
'C' - Ctrl + A
'S' - Ctrl + C
'V' - Ctrl + V
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void maxAprinted(int count, int maxKeys, int op, int printed, int pOutput, int *maxPrinted, char *seqArray)
{
if(count > maxKeys)
return;
if(count == maxKeys)
{
if((*maxPrinted) < printed)
{
//new sequence found which is an improvement over last sequence
(*maxPrinted) = printed;
printf("\n");
int i;
for(i=0; i<maxKeys; i++)
printf(" %c,",seqArray[i]);
}
return;
}
switch(op)
{
case 1:
//A keystroke
printed++;
seqArray[count] = 'A';
count++;
break;
case 2:
//Ctrl-A and then Ctrl-C
if((count+2) < maxKeys)
{
pOutput = printed;
//comment the below statement to NOT factor
//in the assumption described above
printed = 0;
}
seqArray[count] = 'C';
count++;
seqArray[count] = 'S';
count++;
break;
case 3:
//Ctrl-V
printed = printed + pOutput;
seqArray[count] = 'V';
count++;
break;
}
maxAprinted(count, maxKeys, 1, printed, pOutput, maxPrinted, seqArray);
maxAprinted(count, maxKeys, 2, printed, pOutput, maxPrinted, seqArray);
maxAprinted(count, maxKeys, 3, printed, pOutput, maxPrinted, seqArray);
}
int main()
{
const int keyStrokes = 11;
//this array stores the sequence of keystrokes
char *sequence;
sequence = (char*)malloc(sizeof(char)*(keyStrokes + 1));
//stores the max count for As printed for a sqeuence
//updated in the recursive call.
int printedAs = 0;
maxAprinted(0, keyStrokes, 1, 0, 0, &printedAs, sequence);
printf(" :%d:", printedAs);
return 0;
}