Все удачные наборы команд должны включать остановку на отметке 12 футов. На отметку 1 фут робот может попасть с одной команды A; на отметку 2 фута - с команд AA и B (всего 2 набора команд); на отметку 3 фута - с команд AAA, AB, BA и C (4 набора). Так как за одну команду робот может переместиться на 1, 2 или 3 фута, то для подсчета количества наборов команд, позволяющих роботу попасть на отметки N > 3, можно использовать формулу K(N) = K(N-1)+K(N-2)+K(N-3). Напимер, на отметку 4 фута робот может попасть с отметок 3, 2 или 1 фут, следовательно, количество попасть на отметку 4 определяется как K(3)+K(2)+K(1). K(4) = K(3)+K(2)+K(1) = 4+2+1 = 7 K(5) = K(4)+K(3)+K(2) = 7+4+2 = 13 K(6) = K(5)+K(4)+K(3) = 13+7+4 = 24 K(7) = K(6)+K(5)+K(4) = 24+13+7 = 44 K(8) = K(7)+K(6)+K(5) = 44+24+13 = 81 K(9) = K(8)+K(7)+K(6) = 81+44+24 = 149 K(10) = K(9)+K(8)+K(7) = 149+81+44 = 274 K(11) = K(10)+K(9)+K(8) = 274+149+81 = 504 K(12) = K(11)+K(10)+K(9) = 504+274+149 = 927 Так как вторая часть пути робота также имеет длину 12, то общее количество удачных наборов команд = 927*927 = 859 329
PascalABC.NET 3.3.5, сборка 1650 от 01.04.2018 Внимание! Если программа не работает, обновите версию!
procedure BubbleSort(a:array of integer; descending:Boolean:=False; // нужна ли сортировка по невозрастанию u:integer:=-1; // начальный индекс v:integer:=-1); // конечный индекс // Простая пузырьковая сортировка элементов с индексами с u по v begin // обеспечим корректность параметров u и v if u<0 then u:=0; var n:=a.Length; if (v<0) or (v>=n) then v:=n-1; if u>v then Swap(u,v) else if u=v then Exit; // собственно, сортировка if descending then begin // по невозрастанию for var i:=v-1 downto u do for var j:=u to i do if a[j]<a[j+1] then Swap(a[j],a[j+1]) end else begin for var i:=v-1 downto u do // по неубыванию for var j:=u to i do if a[j]>a[j+1] then Swap(a[j],a[j+1]) end end;
begin Write(': '); var a:=ArrRandom; a.Println; var (imin,imax):=(a.IndexMin,a.IndexMax); var b:=Copy(a); Write('1: '); BubbleSort(b,False,0,imax); b.Println; b:=Copy(a); Write('2: '); BubbleSort(b,False,imin); b.Println; b:=Copy(a); Write('3: '); BubbleSort(b,True,imax,imin); b.Println end.
На отметку 1 фут робот может попасть с одной команды A;
на отметку 2 фута - с команд AA и B (всего 2 набора команд);
на отметку 3 фута - с команд AAA, AB, BA и C (4 набора).
Так как за одну команду робот может переместиться на 1, 2 или 3 фута, то для подсчета количества наборов команд, позволяющих роботу попасть на отметки N > 3, можно использовать формулу
K(N) = K(N-1)+K(N-2)+K(N-3).
Напимер, на отметку 4 фута робот может попасть с отметок 3, 2 или 1 фут, следовательно, количество попасть на отметку 4 определяется как K(3)+K(2)+K(1).
K(4) = K(3)+K(2)+K(1) = 4+2+1 = 7
K(5) = K(4)+K(3)+K(2) = 7+4+2 = 13
K(6) = K(5)+K(4)+K(3) = 13+7+4 = 24
K(7) = K(6)+K(5)+K(4) = 24+13+7 = 44
K(8) = K(7)+K(6)+K(5) = 44+24+13 = 81
K(9) = K(8)+K(7)+K(6) = 81+44+24 = 149
K(10) = K(9)+K(8)+K(7) = 149+81+44 = 274
K(11) = K(10)+K(9)+K(8) = 274+149+81 = 504
K(12) = K(11)+K(10)+K(9) = 504+274+149 = 927
Так как вторая часть пути робота также имеет длину 12, то общее количество удачных наборов команд = 927*927 = 859 329
Внимание! Если программа не работает, обновите версию!
procedure BubbleSort(a:array of integer;
descending:Boolean:=False; // нужна ли сортировка по невозрастанию
u:integer:=-1; // начальный индекс
v:integer:=-1); // конечный индекс
// Простая пузырьковая сортировка элементов с индексами с u по v
begin
// обеспечим корректность параметров u и v
if u<0 then u:=0;
var n:=a.Length;
if (v<0) or (v>=n) then v:=n-1;
if u>v then Swap(u,v)
else if u=v then Exit;
// собственно, сортировка
if descending then begin // по невозрастанию
for var i:=v-1 downto u do
for var j:=u to i do
if a[j]<a[j+1] then Swap(a[j],a[j+1])
end
else begin
for var i:=v-1 downto u do // по неубыванию
for var j:=u to i do
if a[j]>a[j+1] then Swap(a[j],a[j+1])
end
end;
begin
Write(': ');
var a:=ArrRandom;
a.Println;
var (imin,imax):=(a.IndexMin,a.IndexMax);
var b:=Copy(a);
Write('1: '); BubbleSort(b,False,0,imax); b.Println;
b:=Copy(a);
Write('2: '); BubbleSort(b,False,imin); b.Println;
b:=Copy(a);
Write('3: '); BubbleSort(b,True,imax,imin); b.Println
end.
Пример
: 70 61 10 72 17 84 19 35 83 47
1: 10 17 61 70 72 84 19 35 83 47
2: 70 61 10 17 19 35 47 72 83 84
3: 70 61 84 72 17 10 19 35 83 47