Położenie dwóch hetmanów.

0

Wiadomo , że hetmany nie mogą znajdować się na tej samej osi X i Y oraz przekątnych.
Mamy tablice[10][10].

Z osiami OX i OY poradziłem sobie , niestety nie mam pomysłu jak zrobić aby 2 hetman nie wylosował współrzędnych punktu na osiach 1 hetmana.

!!!
Ważna uwaga, wspolrzedne maja byc wylosowane poprawne za 1 razem, nie mozna uzywac zadnych petli while lub czy para spelnia warunki

0

Hmm... patrz przykład dla przekątnej "z prawej góry na lewy dół" (tutaj dla planszy 5x5, ale wielkość planszy nie ma znaczenia):

 X01234
Y+-----
0|.....
1|....A
2|...B.
3|..C..
4|.D...

Punkty A,B,C,D leżą na jednej takiej przekątnej. Mamy: A=(4,1), B=(3,2), C=(2,3), D=(1,4). Widzisz jakąś zależność? (podpowiedź: musisz wykonać działanie na współrzędnych X i Y)

Analogicznie rozpatrz sobie dla przekątnych "z lewej góry na prawy dół".

0

Wiadomo , że można sprawdzać czy abs(x1-x2) == abs(y1-y2) i tak długo aż będą różne , niestety mankament polega na tym że wspolrzedne maja byc poprawne za pierwszym razem, nie wolno uzywac petli while itp.

0

Można to jeszcze zrobić tak:

  1. Losujesz poprawną parę (x1, y1).
  2. 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.
  3. 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...

1 użytkowników online, w tym zalogowanych: 0, gości: 1