Feladványok megoldása (2)
Folytassuk tovább a
metódusokkal való ismerkedést.
Pointing Triples (PT)
A metódus: Ha
egy tartományban egy jelölt csak három helyen van, de egy sorban vagy egy
oszlopban, akkor a kijelölt sorban vagy oszlopban a többi helyről a jelölt
törölhető. A következő feladványban a G1I3 tartományban a 6-os csak három
cellában található (G3, H3 és I3), de mindegyik a 3-as sorban, ezért a teljes
3-as sor további celláiból törölhető. A törlés a piros hátterű cellákat érinti:
A PT bekapcsolása után ezt láthatjuk:
A Pointing Triples rutinja:
Procedure PointingTriples;
Var I, J, K, A, B, C, U, V, Z: Word;
Begin
//Pointing Triples
//ha egy tartomanyban egy szam csak harom helyen van, de egy sorban vagy egy
//oszlopban, akkor a kijelolt sorban vagy oszlopban a tobbi helyrol a szam
//torolheto
For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
If TartN(J,InT[I])=3 Then
Begin
A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0; //a tartomanyon beluli helyek
For K:= Max*((I-1) Div Max)+1 To Max*((I-1) Div Max)+Max Do
If SH[K,J]=1 Then If A=0 Then
Begin U:= K; A:= InX[K] End Else If B=0 Then
Begin V:= K; B:= InX[K] End Else
Begin Z:= K; C:= InX[K] End;
If (A<>0) And (B<>0) And (A=B) And (A=C) Then //egy oszlop
For K:= 1 To MX Do If SM[K]=0 Then
If (InX[K]=A) And (K<>U) And (K<>V) And (K<>Z) Then
Begin SH[K][J]:= 0 End;
A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0; //a tartomanyon beluli helyek
For K:= Max*((I-1) Div Max)+1 To Max*((I-1) Div Max)+Max Do
If SH[K,J]=1 Then If A=0 Then
Begin U:= K; A:= InY[K] End Else If B=0 Then
Begin V:= K; B:= InY[K] End Else
Begin Z:= K; C:= InY[K] End;
If (A<>0) And (B<>0) And (A=B) And (A=C) Then //egy sor
For K:= 1 To MX Do If SM[K]=0 Then
If (InY[K]=A) And (K<>U) And (K<>V) And (K<>Z) Then
Begin SH[K][J]:= 0 End;
End;
End;
Naked Triples (NT)
A metódus: Ha egy szobában, három cellában (egy
sorban, egy oszlopban vagy egy tartományban) van csak ugyanaz a három jelölt, akkor
a többi cellából ezek a jelöltek törölhetők. A következő feladványban az
A5, B5 és C5 cellákban csak a 2, 8 és 9 jelöltek találhatók, ezért az A4C6
tartományból és az 5-ös sor további celláiból a jelöltek törölhetők. A törlés a
piros hátterű cellákat érinti:
Az NT bekapcsolása után ezt látjuk:
A Naked Triples rutinja:
Procedure NakedTriples;
Var I, J, K, L: Word;
Begin
//Naked Triples
//ha egy szobaban harom helyen van csak ugyanaz a harom szam,
//akkor a tobbi helyrol ezek a szamok torolhetok
For I:= 1 To MX-2 Do If SM[I]=0 Then If Osszeg(SH[I])=3 Then
For J:= I+1 To Mx-1 Do If SM[J]=0 Then If Osszeg(SH[J])=3 Then
For K:= J+1 To MX Do If SM[K]=0 Then If Osszeg(SH[K])=3 Then
Begin
If (InX[I]=InX[J]) And (InX[J]=InX[K]) And //ha egy oszlopban vannak
Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then //és egyenlok
For L:= 1 To MX Do If SM[L]=0 Then
If (InX[L]=InX[K]) And (L<>I) And (L<>J) And (L<>K) Then
Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
If (InY[I]=InY[J]) And (InY[J]=InY[K]) And //ha egy sorban vannak
Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then //és egyenlok
For L:= 1 To MX Do If SM[L]=0 Then
If (InY[L]=InY[K]) And (L<>I) And (L<>J) And (L<>K) Then
Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
If (InT[I]=InT[J]) And (InT[J]=InT[K]) And //ha egy tartomanyban vannak
Egyenlo(SH[I],SH[J]) And Egyenlo(SH[J],SH[K]) Then //és egyenlok
For L:= 1 To MX Do If SM[L]=0 Then
If (InT[L]=InT[K]) And (L<>I) And (L<>J) And (L<>K) Then
Begin SH[L]:= Kivesz(SH[L],SH[K]) End;
End;
End;
Hidden Triples (HT)
A metódus: Ha
egy szobában csak három cellában (egy sorban, egy oszlopban vagy egy
tartományban) található három jelölt (de más még lehet), akkor a szoba ezen három mezőjéből minden más jelölt törölhető. A
következő feladvány a H oszlopában az 1, 4 és 8-as jelölt csak a 6, 8 és 9-es
sorban található. Nem mindegyikben mind a három, a 6-os sorban az 1-es és a
8-as jelölt, a 8-as sorban mind a három, míg a 9-es sorban a 4-es és a 8-as
jelölt. A piros háttérszínű cellákban tehát csökkenni fog a jelöltek száma.
A HT bekapcsolása után ezt láthatjuk:
A Hidden Triples rutinja:
Procedure HiddenTriples;
Var I, J, K, L, M, N, S: Word;
Q: TTomb;
OFi, SFi, TFi: Array[1..Max] Of Boolean;
Begin
//Hidden Triples
For I:= 1 To Max Do Begin OFi[I]:= False; SFi[I]:= False; TFi[I]:= False End;
//ha egy szobaban csak harom helyen talalhato harom szam (de mas meg lehet),
//akkor ezen harom helyrol a tobbi szam torolheto
For I:= 1 To MX Do If SM[I]=0 Then
For J:= 1 To Max Do For K:= 1 To Max Do For L:= 1 To Max Do
If (K<>J) And (L<>J) And (L<>K) Then //J,K,L: a keresett szamok
Begin
//ha a harom szám legfeljebb harom helyen van es egy oszlopban
If Not OFi[InX[I]] Then
If ((OszlopN(J,InX[I])>0) And (OszlopN(J,InX[I])<4)) And
((OszlopN(K,InX[I])>0) And (OszlopN(K,InX[I])<4)) And
((OszlopN(L,InX[I])>0) And (OszlopN(L,InX[I])<4)) Then
Begin
Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then
If (InX[M]=InX[I]) Then
If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
S:= 0; For M:= 1 To MX Do S:= S+Q[M];
If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
If (N<>J) And (N<>K) And (N<>L) Then
Begin SH[M,N]:= 0;
OFi[InX[I]]:= True
End;
End;
//ha a harom szam legfeljebb harom helyen van es egy sorban
If Not SFi[InY[I]] Then
If ((SorN(J,InY[I])>0) And (SorN(J,InY[I])<4)) And
((SorN(K,InY[I])>0) And (SorN(K,InY[I])<4)) And
((SorN(L,InY[I])>0) And (SorN(L,InY[I])<4)) Then
Begin
Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then If (InY[M]=InY[I]) Then
If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
S:= 0; For M:= 1 To MX Do S:= S+Q[M];
If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
If (N<>J) And (N<>K) And (N<>L) Then
Begin SH[M,N]:= 0; SFi[InY[I]]:= True End;
End;
//ha a harom szam legfeljebb harom helyen van es egy tartomanyban
If Not TFi[InT[I]] Then
If ((TartN(J,InT[I])>0) And (TartN(J,InT[I])<4)) And
((TartN(K,InT[I])>0) And (TartN(K,InT[I])<4)) And
((TartN(L,InT[I])>0) And (TartN(L,InT[I])<4)) Then
Begin
Q:= CS; For M:= 1 To MX Do If SM[M]=0 Then If (InT[M]=InT[I]) Then
If (SH[M,J]=1) Or (SH[M,K]=1) Or (SH[M,L]=1) Then Q[M]:= 1;
S:= 0; For M:= 1 To MX Do S:= S+Q[M];
If S=3 Then For M:= 1 To MX Do If Q[M]=1 Then For N:= 1 To Max Do
If (N<>J) And (N<>K) And (N<>L) Then
Begin SH[M,N]:= 0; TFi[InT[I]]:= True End;
End;
End;
End;
Naked Quads (NQ)
A metódus: Ha
egy szobában van olyan négy nem üres cella (egy sorban, egy oszlopban vagy egy
tartományban), amelyben összesen négy jelölt van, akkor a többi helyről ezek a
jelöltek törölhetők. A következő feladvány A7C9 tartományának az A9, B7, B8
és C9 olyan négy nem üres cellája, amelyekben csak az 1, 2, 4 és 9-es jelöltek
találhatók. Ezért az A7C9 tartomány további celláiból ez a négy jelölt
törölhet. Ez aktuálisan azt jelenti, hogy a C8-as mezőből (piros a háttérszíne)
a 2-es és 4-es jelölt törölhető.
Az NQ bekapcsolása után ezt láthatjuk:
Természetesen ez nem
csak tartományra, hanem sorra és oszlopra is érvényes, ha a négy cella egy
sorban vagy egy oszlopban található. Gyakran nagyon hatékony ez a metódus. Lássunk
erre egy példát. A következő feladványban a piros hátterű cellákban fog
csökkeni a jelöltek száma:
Az NQ bekapcsolása után ezt láthatjuk:
Észrevehetjük, hogy az
NQ bekapcsolása előtt csak 2 jelölt
volt Beírható a feladványban, most viszont 11, azaz ez a metódus nagymértékben
hozzájárult a jelöltek számának csökkentéséhez.
A Naked Quads rutinja:
Function Negyes(A, B, C, D: KTomb): Boolean;
Var I: Word;
P: KTomb;
Begin
P:= CH; For I:= 1 To Max Do
If (A[I]=1) Or (B[I]=1) Or (C[I]=1) Or (D[I]=1) Then P[I]:= 1;
Negyes:= Osszeg(P)=4;
End;
Procedure NakedQuads;
Var I, J, K, L, M, N: Word;
P: KTomb;
Begin
//Naked Quads
//ha egy szobaban van olyan negy nem ures cella, amelyben osszesen negy szám
//van, akkor a tobbi helyrol ezek a szamok torolhetok
For I:= 1 To MX-3 Do If SM[I]=0 Then If Osszeg(SH[I])>0 Then
For J:= I+1 To MX-2 Do If SM[J]=0 Then If Osszeg(SH[J])>0 Then
For K:= J+1 To MX-1 Do If SM[K]=0 Then If Osszeg(SH[K])>0 Then
For L:= K+1 To MX Do If SM[L]=0 Then If Osszeg(SH[L])>0 Then
Begin
If (InX[I]=InX[J]) And (InX[J]=InX[K]) And //ha egy oszlopban vannak
(InX[K]=InX[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
For M:= 1 To MX Do If SM[M]=0 Then
If (InX[M]=InX[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
Begin
P:= CH; For N:= 1 To Max Do
If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
End;
If (InY[I]=InY[J]) And (InY[J]=InY[K]) And //ha egy sorban vannak
(InY[K]=InY[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
For M:= 1 To MX Do If SM[M]=0 Then
If (InY[M]=InY[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
Begin
P:= CH; For N:= 1 To Max Do
If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
End;
If (InT[I]=InT[J]) And (InT[J]=InT[K]) And //ha egy tartomanyban vannak
(InT[K]=InT[L]) And Negyes(SH[I],SH[J],SH[K],SH[L]) Then
For M:= 1 To MX Do If SM[M]=0 Then
If (InT[M]=InT[L]) And (M<>I) And (M<>J) And (M<>K) And (M<>L) Then
Begin
P:= CH; For N:= 1 To Max Do
If (SH[I][N]=1) Or (SH[J][N]=1) Or (SH[K][N]=1) Or (SH[L][N]=1) Then
P[N]:= 1; SH[M]:= Kivesz(SH[M],P);
End;
End;
End;
Hidden Quads (HQ)
A metódus: Ha
egy szobában csak négy cellában (értelemszerűen egy sorban, egy oszlopban vagy
egy tartományban) található négy jelölt (de más jelölt még lehet), akkor ezen négy cellából a többi jelölt törölhető. A következő
feladvány a B4, B5, B6 és B9 celláiban található csak a 3, 4, 7 és 8-as jelölt,
ezért a jelzett cellákból a többi jelölt törölhető. (A B5-ös cellában nem volt
további jelölt.)
A HQ bekapcsolása után ezt láthatjuk:
A Hidden Quads rutinja:
Procedure HiddenQuads;
Var I, J, K, L, M, N, O, S: Word;
Q: TTomb;
OFi, SFi, TFi: Array[1..Max] Of Boolean;
Begin
//Hidden Quads
For I:= 1 To Max Do Begin OFi[I]:= False; SFi[I]:= False; TFi[I]:= False End;
//ha egy szobaban csak negy helyen talalhato negy szam (de mas meg lehet),
//akkor ezen negy helyrol a tobbi szam torolheto
For I:= 1 To MX Do If SM[I]=0 Then
For J:= 1 To Max Do For K:= 1 To Max Do
For L:= 1 To Max Do For M:= 1 To Max Do
If (K<>J) And
(L<>J) And (L<>K) And
(M<>J) And (M<>K) And (M<>L) Then //J,K,L,M: a keresett számok
Begin
//ha a negy szam legfeljebb negy helyen van es egy oszlopban
If Not OFi[InX[I]] Then
If ((OszlopN(J,InX[I])>0) And (OszlopN(J,InX[I])<5)) And
((OszlopN(K,InX[I])>0) And (OszlopN(K,InX[I])<5)) And
((OszlopN(L,InX[I])>0) And (OszlopN(L,InX[I])<5)) And
((OszlopN(M,InX[I])>0) And (OszlopN(M,InX[I])<5)) Then
Begin
Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InX[N]=InX[I]) Then
If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
Then Q[N]:= 1;
S:= 0; For N:= 1 To MX Do S:= S+Q[N];
If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
Begin SH[N,O]:= 0;
OFi[InX[I]]:= True
End;
End;
//ha a negy szam legfeljebb negy helyen van és egy sorban
If Not SFi[InY[I]] Then
If ((SorN(J,InY[I])>0) And (SorN(J,InY[I])<5)) And
((SorN(K,InY[I])>0) And (SorN(K,InY[I])<5)) And
((SorN(L,InY[I])>0) And (SorN(L,InY[I])<5)) And
((SorN(M,InY[I])>0) And (SorN(M,InY[I])<5)) Then
Begin
Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InY[N]=InY[I]) Then
If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
Then Q[N]:= 1;
S:= 0; For N:= 1 To MX Do S:= S+Q[N];
If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
Begin SH[N,O]:= 0;
SFi[InY[I]]:= True
End;
End;
//ha a negy szám legfeljebb negy helyen van és egy tartomanyban
If Not TFi[InT[I]] Then
If ((TartN(J,InT[I])>0) And (TartN(J,InT[I])<5)) And
((TartN(K,InT[I])>0) And (TartN(K,InT[I])<5)) And
((TartN(L,InT[I])>0) And (TartN(L,InT[I])<5)) And
((TArtN(M,InT[I])>0) And (TartN(M,InT[I])<5)) Then
Begin
Q:= CS; For N:= 1 To MX Do If SM[N]=0 Then If (InT[N]=InT[I]) Then
If (SH[N,J]=1) Or (SH[N,K]=1) Or (SH[N,L]=1) Or (SH[N,M]=1)
Then Q[N]:= 1;
S:= 0; For N:= 1 To MX Do S:= S+Q[N];
If S=4 Then For N:= 1 To MX Do If Q[N]=1 Then For O:= 1 To Max Do
If (O<>J) And (O<>K) And (O<>L) And (O<>M) Then
Begin SH[N,O]:= 0;
SFi[InT[I]]:= True
End;
End;
End;
End;
Box Line Reduction Pairs (BP)
A metódus: Ha
egy oszlopban vagy sorban egy szám kétszer egy tartományon belül ismétlődik, és
csak kétszer szerepel az oszlopban vagy sorban, akkor a tartományon belül a
többi helyről törölhető. A következő feladvány B oszlopában az 1-es csak
kétszer fordul elő (B5 és B6) és ez a két hely egy tartományon belül van
(A4C6-ban), ezért ebben a tartományban minden más helyről az 1-es törölhető.
Azaz a piros hátterű cellákból törlődnek az 1-esek.
A BP bekapcsolása után ezt látjuk:
Ebben a feladványban
még további két tartományban figyelhető meg a BP hatása: a D1F3 és G7I9
tartományokban. Az F1 és F3-ban található 4-es miatt a D1 és D3-ból törlődött a
négyes, a D3 és F3-ban található 5-ös miatt törlődik az F2-ben az 5-ös.
A BP bekapcsolása után ezt láthatjuk:
Hasonlóan a G7I9
tartományban a G8 és I8-ban lévő 4-es miatt törlődik a G9-ből a 4-es.
A BP bekapcsolása után ezt látjuk:
A Box Line Reduction Pairs rutinja:
Procedure BoxLRPairs;
Var I, J, K, A, B, U, V: Word;
Begin
//Box Line Reduction Pairs
//ha egy oszlopban vagy sorban egy szam ketszer egy tartomanyon belul
//ismetlodik es csak ketszer szerepel az oszlopban vagy sorban,
//akkor a tartomanyon belul a tobbi helyrol torolheto
For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
Begin
If OszlopN(J,InX[I])=2 Then //oszlop szerint
Begin
A:= 0; B:= 0; U:= 0; V:= 0;
For K:= 1 To MX Do If SM[K]=0 Then
If (InX[K]=InX[I]) And (SH[K,J]=1) Then If A=0 Then
Begin U:= K; A:= InT[K] End Else Begin V:= K; B:= InT[K] End;
If (A<>0) And (A=B) Then //ha egy tartomanyban vannak
For K:= 1 To MX Do If SM[K]=0 Then
If InT[K]=A Then If (K<>U) And (K<>V) Then
Begin SH[K,J]:= 0 End;
End;
If SorN(J,InY[I])=2 Then //sor szerint
Begin
A:= 0; B:= 0; U:= 0; V:= 0;
For K:= 1 To MX Do If SM[K]=0 Then
If (InY[K]=InY[I]) And (SH[K,J]=1) Then If A=0 Then
Begin U:= K; A:= InT[K] End Else Begin V:= K; B:= InT[K] End;
If (A<>0) And (A=B) Then //ha egy tartomanyban vannak
For K:= 1 To MX Do If SM[K]=0 Then
If InT[K]=A Then If (K<>U) And (K<>V) Then
Begin SH[K,J]:= 0 End;
End;
End;
End;
Box Line Reduction Triples (BT)
A metódus: Ha
egy oszlopban vagy sorban egy jelölt háromszor egy tartományon belül ismétlődik,
és csak háromszor szerepel az oszlopban vagy sorban, akkor a tartományon belül
a többi helyről törölhető. A következő feladványban A
B oszlopban a 8-as csak a B4, B5 és B6 cellákban található (és egy
tartományban), ezért a 8-as az A4C6 tartomány további celláiból törölhető. Ezek
a cellák a C4 és C6, piros háttérszínnel jelölve:
A BT bekapcsolása után ezt látjuk:
A Box Line Reduction Triples rutinja:
Procedure BoxLRTriples;
Var I, J, K, A, B, C, U, V, Z: Word;
Begin
//Box Line Reduction Triples
//ha egy oszlopban vagy sorban egy szam haromszor egy tartomanyon belul
//ismetlodik es csak haromszor szerepel az oszlopban vagy sorban,
//akkor a tartomanyon belul a tobbi helyrol torolheto
For I:= 1 To MX Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresendo szam
Begin
If OszlopN(J,InX[I])=3 Then //oszlop szerint
Begin
A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0;
For K:= 1 To MX Do If SM[K]=0 Then
If (InX[K]=InX[I]) And (SH[K,J]=1) Then If A=0 Then
Begin U:= K; A:= InT[K] End Else If B=0 Then
Begin V:= K; B:= InT[K] End Else
Begin Z:= K; C:= InT[K] End;
If (A<>0) And (B<>0) And (A=B) And (A=C) Then //ha egy tartomanyban vannak
For K:= 1 To MX Do If SM[K]=0 Then
If InT[K]=A Then If (K<>U) And (K<>V) And (K<>Z) Then
Begin SH[K,J]:= 0 End;
End;
If SorN(J,InY[I])=3 Then //sor szerint
Begin
A:= 0; B:= 0; C:= 0; U:= 0; V:= 0; Z:= 0;
For K:= 1 To MX Do If SM[K]=0 Then
If (InY[K]=InY[I]) And (SH[K,J]=1) Then If A=0 Then
Begin U:= K; A:= InT[K] End Else If B=0 Then
Begin V:= K; B:= InT[K] End Else
Begin Z:= K; C:= Int[K] End;
If (A<>0) And (B<>0) And (A=B) And (A=C) Then //ha egy tartomanyban vannak
For K:= 1 To MX Do If SM[K]=0 Then
If InT[K]=A Then If (K<>U) And (K<>V) And (K<>Z) Then
Begin SH[K,J]:= 0 End;
End;
End;
End;
X-Wing (XW)
A metódus: Ha
két jelölt két oszlopban pontosan kétszer-kétszer szerepel, de ugyanabban a két
sorban, akkor a két sor további helyeiről a jelölt törölhető. A következő
feladványban a az F és I oszlopban a 9-es jelölt
kétszer-kétszer szerepel egy-egy sorban (F4, I4 és F6 I6), ezért a 9-es a 4-es
és a 6-os sorok további helyeiről törölhető (piros hátterű cellák):
Az XW bekapcsolása után ezt látjuk:
Az X-Wing rutinja:
Procedure XWing;
Var I, J, K, L, M, A, B, C, D: Word;
Begin
//X-Wing
//ha ket szam ket oszlopban pontosan ketszer-ketszer szerepel, de ugyanabban
//a ket sorban, akkor a ket sor tovabbi helyeirol a szam torolheto
For I:= 1 To MX-1 Do If SM[I]=0 Then For J:= 1 To Max Do //J: keresett szám
Begin
If OszlopN(J,InX[I])=2 Then //oszlop szerint
For K:= I+1 To MX Do If SM[K]=0 Then
If (InX[K]<>InX[I]) And (OszlopN(J,InX[K])=2) Then //masik oszlop
Begin
A:= 0; B:= 0; C:= 0; D:= 0;
For L:= 1 To MX Do If SM[L]=0 Then
If (InX[L]=InX[I]) And (SH[L,J]=1) Then
If A=0 Then A:= InY[L] Else B:= InY[L];
For L:= 1 To MX Do If SM[L]=0 Then
If (InX[L]=InX[K]) And (SH[L,J]=1) Then
If C=0 Then C:= InY[L] Else D:= InY[L];
If (A=C) And (B=D) Then
For L:= 1 To MX Do
If (InX[L]<>InX[I]) And (InX[L]<>InX[K]) And
((InY[L]=A) Or (InY[L]=B)) Then
Begin For M:= 1 To Max Do If M<>J Then SH[L,J]:= 0 End;
End;
End;
End;
Y-Wing (YW)
A metódus: Ha
három jelölt (legyenek: A, B és C) úgy helyezkedik el egy derékszögű háromszög csúcsainak
megfelelő cellákban, hogy mindegyikben pontosan kettő, de bármely két cella jelöltjei
között csak egy közös található (azaz: A és B, A és C
valamint B és C), akkor a hegyesszögű csúcsok sorának illetve oszlopának
metszésében lévő cellából a hegyesszögű csúcsokban lévő cellák közös jelöltje törölhető.
A következő feladványban a metódusnak megfelelő három cella G1, D7 és G7,
melyekben csak a 2, 4 és 8-as jelöltek találhatók, és bármelyik kettőnek csak
egy közös jelöltje van. A negyedik cella a D1-es, melyből a G1 és D7 közös
jelöltje a 2-es törölhető.
Az YW bekapcsolása után ezt látjuk:
Az Y-Wing rutinja:
Function Hossz(K: KTomb): Word;
Var I, N: Word;
Begin
N:= 0; For I:= 1 To Max Do If K[I]=1 Then Inc(N); Hossz:= N;
End;
Function Metszet(A, B: KTomb): KTomb;
Var I: Word;
P: KTomb;
Begin
P:= A; For I:= 1 To Max Do P[I]:= A[I]*B[I]; Metszet:= P;
End;
Function Unio(A, B, C: KTomb): KTomb;
Var I: Word;
P: KTomb;
Begin
P:= A;
For I:= 1 To Max Do Begin P[I]:= A[I]+B[I]+C[I]; If P[I]>0 Then P[I]:= 1 End;
Unio:= P;
End;
Procedure YWing;
Var I, J, K: Word;
Begin
//Y-Wing
//ha harom szam (A, B es C) ugy helyezkedik el egy derekszogu haromszog
//csucsainak megfelelo helyeken, hogy mindegyikben pontosan ketto,
//de barmely ket hely szamai kozott csak egy kozos talalhato
//(azaz: A és B, A és C valamint B és C), akkor a hegyesszogu csucsok soranak
//es oszlopanak metszeseben levo helyrol a hegyesszogu csucsokban levo
//helyek kozos szama torolheto
For I:= 1 To MX Do If SM[I]=0 Then
If Hossz(SH[I])=2 Then
For J:= 1 To Max Do If (TIndex[J,InY[I]]<>I) And (SM[TIndex[J,InY[I]]]=0) Then
If Hossz(SH[TIndex[J,InY[I]]])=2 Then
For K:= 1 To Max Do If (TIndex[InX[I],K]<>I) And (SM[TIndex[InX[I],K]]=0) Then
If Hossz(SH[TIndex[InX[I],K]])=2 Then
If (Hossz(Metszet(SH[I],SH[TIndex[J,InY[I]]]))=1) Then
If (Hossz(Metszet(SH[I],SH[TIndex[InX[I],K]]))=1) Then
If (Hossz(Metszet(SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]))=1) Then
If (Hossz(Unio(SH[I],SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]))=3) Then
SH[TIndex[J,K]]:=
Kivesz(SH[TIndex[J,K]],Metszet(SH[TIndex[J,InY[I]]],SH[TIndex[InX[I],K]]));
End;