Można to jeszcze zrobić tak:
- Losujesz poprawną parę (x1, y1).
- Losujesz y2 takie, że y2 ≠ y1. Jak? Nie możesz wylosować y1, więc zostaje 9 możliwości. Możesz to zrobić np. tak (C++):
y2=rand()%9; if(y2 >= y1) y2++;
Dlaczego? Wyjaśnię na przykładzie - przyjm. że y1=4. Wtedy rand()%9
wygeneruje nam jedną liczbę z listy (0,1,2,3,4,5,6,7,8). Po zrobieniu drugiego polecenia - w tym przypadku if(y2 >= 4) y2++;
dostaniemy jedną liczbę z listy (0,1,2,3,5,6,7,8,9) - o to nam chodziło.
- Teraz najważniejsze jest generowanie odpowiedniego x2. Patrz poniżej:
..........
..........
...X......
..........
.K.L.M.... <=== y2
..........
(...)
Oczywiście X=(x1,y1)
. Punkty K, L, M pokazują, gdzie hetman nie może być postawiony. Zauważ, że K=(x1-(y2-y1),y2)=(x1+y1-y2,y2)
, L=(x1,y2)
, M=(x1+y2-y1, y2)
. W naszym przykładzie K=(1,3), L=(3,3), M=(5,3).
Tutaj wchodzi utrudnienie - punkty K, M mogą znaleźć się poza planszą (punkt K, gdy x1+y1-y2<0||x1+y1-y2>=10
, zaś punkt M, gdy x1+y2-y1<0||x1+y2-y1>=10
).
Teraz zauważamy, że wartość x2
może być prawidłowo wybrana na 10-(ilość punktów ze zbioru K,L,M na planszy). U nas wszystkie trzy leżą na planszy, więc mamy 7 sposobów. Użyjemy więc funkcji rand()%7
.
Losujemy więc nasze x2
(przyjmijmy, że ustrzeliliśmy 2). Teraz dla każdego takiego 0<=n<9
, że należy do posortowanego w kolejności rosnącej zbioru (Kx,Lx,Mx) zwiększamy x2
o 1, jeśli jest większe lub równe niż 'n'. W naszym przypadku posortowany zbiór to (1,3,5). Sprawdzamy:
- Pierwsza liczba to 1:
x2 = 2 >= 1 ==> x2 := 2+1;
- Druga liczba to 3:
x2 = 3 >= 3 ==> x2 := 3+1;
- Trzecia liczba to 5:
x2 = 4 < 5 ==> brak reakcji
Wyjaśnienie tego jest takie samo jak podczas losowania y2
: przed pierwszym przebiegiem mamy zbiór możliwości (0,1,2,3,4,5,6), po 1. przebiegu dostajemy zbiór (0,2,3,4,5,6,7), po 2. - (0,2,4,5,6,7,8), a po 3. - (0,2,4,6,7,8,9), czyli wszystkie liczby od 0 do 9 bez (1,3,5).
Mam nadzieję, że napisałem chociaż trochę zrozumiale...