Chtěl bych poděkovat za došlá řešení. Ačkoliv musím říci, že moje jsou rychlejší, Vaše programy počítají naprosto bezchybně. (Podařilo se mi zoptimalizovat minulé řešení tak, že počítá 2 vteřiny.(!))
Stejně jako u minulého případu bude zřejmě nejlepší postup vyzkoušet všechny kombinace. Předtím jsem však provedl jednoduchou úvahu, které možnosti nemá vůbec cenu zkoušet. Takto se mi podařilo zkrátit výpočet na méně než 5 procent. (I když to v tomto případě není tak dramatické - zkrátil jsem výpočet z 1.45 minuty na cca 4 sec.)
Takže - máme schéma, do nějž máme zapsat 11 čísel 1 až 11 bez opakování. Doporučil bych zkoumat 4 rohové body. Tam můžeme dosadit:
4 lichá čísla - potom ovšem musí být lichá čísla i na spojnicích a úhlopříčkách, aby součet byl také lichý (21) a tolik lichých čísel nemáme. (na čarách mohou být buď 3 lichá čísla, nebo 1 liché a dvě sudá čísla).
3 lichá a 1 sudé - také nelze, protože ve středu by muselo být pro jednu úhlopříčku liché a pro druhou sudé číslo.
2 lichá a 2 sudá čísla "vedle sebe" - tato eventualita by mohla vyhovovat, použijeme na ni všech 5 sudých čísel a 4 lichá a tedy 2 lichá nám zůstanou na "ocásek" navěšený na jednom rohu.
2 lichá a 2 sudá čísla "úhlopříčně" - tady potřebujeme 6 sudých čísel a tolik jich nemáme.
1 liché a 3 sudá čísla - nejde ze stejného důvodu jako 3 lichá a 1 sudé.
4 sudá čísla - tato eventualita je druhá možná.
Takže shrnutí: když zatím odhlédneme od onoho "ocásku" a zaměříme se na matici 9 čísel, je zřejmé, že po jedné její straně, dejme tomu horní, musí být rohová čísla sudá a pochopitelně nesmí být stejná. Pro výpočty můžeme předpokládat např., že levé číslo je menší než pravé - tím vyloučíme výpočty symetrických ekvivalentů podle svislé osy (tedy vlastně stejné výsledky, pouze "zrcadlově obrácené).
Abychom mohli celý systém dopočítat, musíme si zvolit ještě číslo na dvou úhlopříčkách. O něm však nevíme nic bližšího, protože námi zvolené dvě možnosli umožňují jak liché (pro všechna rohová sudá), tak sudé číslo (pro protilehlé liché rohy).
máme li takto zvolené kombinace 3 čísel, můžeme celý příklad dopočítat a zjistit, zda je vůbec reálný.
Nyní ale již k programu:
řádky 10 až 100 nepotřebují snad žádný komentář.
110 vynuluje hodiny a dimenzuje pole 11 proměnných A, kde se budou provádět výpočty a pomocné pole B.
120 definice levého horního rohu I. V cyklu se mu budou přiřazovat všechna sudá čísla (kromě 10, protože k němu bychom nenašli vyšší sudé pro pravý roh).
130 definice proměnné POM. Do ní se uloží nejmenší možné sudé číslo, které je možné dosadit do pravého horního rohu tak, aby platilo:
I+POM+X=21
kde I je levý roh, POM je nejnižší možná hodnota pro pravý roh a X je nejvyšší liché číslo mezi nimi (předpokládá se 11). Pokud je POM menší nebo rovno I, bere se jako POM číslo I+2 - nejbližší vyšší sudé číslo.
140 definice pravého rohu J. Vzhledem k řádku 130 je tu vždy číslo, které dává smysl (sudé POM až 10)
150 definice čísla na úhlopříčkách K. Nabývá sudých i lichých hodnot 10-I až 11 (čísla menší než 10-I nemá cenu testovat. Pravý dolní roh by vyšel větší než 11. (a levý dolní roh je vždy menší jako pravý).
160 a 170 - test, zda číslo na úhlopříčkách není stejné jako jeden z horních rohů. Pokud je, předpoklad se "vyhodí" jako nesprávný (skok na řádek 830)
180 vymazání pomocného pole B
230 až 250 přiřazení hodnot I,J,K do pole A (hodnoty jsou indexovány postupně po řádcích devítičlenné 3x3 matice). Zároveň se použité hodnoty označí v poli B (např. bod A(1) - levý horní bod - obsahuje číslo 6, potom se B(A(1)), neboli B(6), nastaví z 0 na 1).
270 - výpočet hodnoty mezi horními rohy (na spojnici známe 2 body, můžeme snadno spočítat třetí).
280 - je-li vypočtená hodnota mimo interval <1,11>, potom nemá smysl počítat dál, první tři předpokládaná čísla byla chybná.
290 - pokud bylo vypočtené číslo použito, rovněž končíme.
300 vše bylo v pořádku, označíme vypočtené číslo jako použité.
320 až 550 podle stejného schématu dopočítáme zbývajících 5 čísel v matici.
Nyní máme vyhovující matici 9 čísel. 600 nastavíme pomocné proměnné O na 0 a P na 10
610 až 620 cyklus, kde vyhledáváme 2 poslední nepoužitá čísla. Budou uložena do proměnných A(10) a A(11) a jejich součet do proměnné O.
630 až 670 pokud součet O + jeden ze čtyř rohů je roven 21, potom máme řešení.
720 až 780 výpis správného řešení.
830 až 840 konec cyklů definujících první tři body.
890 až 930 výpis potřebného času.
pozn. Pokud by řešení bylo typu 4 sudá čísla v rozích, vypsalo by se jedno správné řešení 4x (našlo by se jako správné pro všechny 4 strany. Nebýt prvního omezení na symetrii, vypsalo by se 8x, a výpočet by trval 2x déle).
Jan Walla