Hər bir proqramçı "Hanoi qüllələri" tapmacasını tanıyır. Onun şərtini qısa şəkildə xatırladaq.
3 çubuq var: A, B, C. Əvvəlcə müxtəlif diametrli n disk A çubuğunda yerləşir: ən kiçik disk yuxarıda, daha böyük diametrli disklər isə aşağıda yerləşdirilmişdir. İkinci və üçüncü çubuqlar boşdur.
Məqsəd bütün diskləri A çubuğundan B çubuğuna köçürməkdir, burada C köməkçi kimi istifadə edilə bilər.
Bir addımda yalnız üst disk bir çubuqdan götürülərək ya boş çubuğa, ya da digər çubuqda olan daha böyük diametrli diskin üstünə qoyula bilər.
Demək olar ki, bütün proqramlaşdırma kitablarında bu məsələnin rekursiv həlli var. Aşağıda Pascal dilində yazılmış prosedur göstərilmişdir:
Procedure Hanoi (A, B, C: integer; N: integer);
Begin If N > 0 then Begin Hanoi (A, C, B, N-1); Writeln('Disk ', N, ' from ', A, ' to ', B); Hanoi (C, B, A, N-1); End End;
Məsələn, "BCA" kombinasiyası ən kiçik diskin B çubuğunda, orta diskin C çubuğunda və ən böyük diskin A çubuğunda yerləşdiyini göstərir.
Münsiflər heyəti yarışa hazırlaşarkən bəzən bu oyunu oynayıb, cari kombinasiyaları (hər birini ayrı bir kağızda) qeyd edirdi. Sonradan bu kağızlar qarışdı.
Verilmiş hər kombinasiyanın oyunda olub-olmadığını təyin edən və bütün kombinasiyaları oyunun standart ardıcıllığına uyğun sıralayan proqram yazın.
Birinci sətirdə iki tam ədəd n (1 \leq n \leq 250) — disklərin sayı və m (1 \leq m \leq 1000) — kombinasiyaların sayı verilir. Növbəti m sətirdə kombinasiyalar verilir. Hər kombinasiyada n böyük hərf ilə ("A", "B" və ya "C") disklərin çubuqlardakı mövqeyi təsvir olunur. Birinci (ən soldakı) hərf ən kiçik diskin mövqeyini, ikinci hərf ikinci ən kiçik diskin mövqeyini göstərir və s.
m sətir çıxarın — girişdə verilən m kombinasiyanı oyunun gedişindəki ardıcıllığa görə sıralayın.
Nümunə 1