(*A megkapott listabol allit elo sor/oszlop listat*) fun beszurmind([])=[]| beszurmind(A::L)=(A,0)::beszurmind(L); (*Az (A,B) elemekbol allo listabol kikeresi a Sor-adik elemet es megnezi, hogy az negativ e vagy pedig A=B-e, ha igen igaz, ha nem hamis*) fun checklist([],Sor)=false| checklist((A,B)::D,Sor)= if Sor>1 then checklist(D,Sor-1) else if Sor<1 then false else if A<0 then true else A>B; (*Az (A,B) elemekbol allo listabol kikeresi a Sor-adik elemet es megniveli B-t eggyel, visszateresi erteke a megvaltoztatott lista*) fun modifylist([],Sor)=[]| modifylist((A,B)::D,Sor)= if Sor>1 then (A,B)::modifylist(D,Sor-1) else (A,(B+1))::D; (* megnezi, hogy az elso ket parameterben kapott koordinatakhoz vannak -e kozeli elemek, a harmadik parameterben kapott ketelemu parokbol allo listaban (kozeli elem: vagy oldaluk vagy sarkuk erintkezik), ha van kozeli koosrdinata akkor hamissal ter vissza, egyebkent igazzal*) fun checktav(A,B,[])=true| checktav(A,B,(C,D)::E)= if (abs(A-C)<2) then if (abs(B-D)<2) then false else checktav(A,B,E) else checktav(A,B,E); (*Vegigfut a kapott ketelemu parokbol kapott listan es ellenorzi, hogy a parok elso eleme negativ -e vagypedig megegyezik -e a masik elemmel, ha talal olyat ami nem akkor meghiusul*) fun checkmegoldas([])=true| checkmegoldas((A,B)::C)=if (A=B) then checkmegoldas(C) else if A<0 then checkmegoldas(C) else false; (*megnezi, hogy van -e olyan megoldas ami az E parametreben kapott megoldas sorozat folytatasa(E ketelemu parok listaja, amik a satrak koordinatait jelolik.), S az sorok listaja, O az oszlopoke (ketelemu parok, ahol az elso elem a kivant ertek, a masodik a jelenlegi),a harmadik parameter pedig a meg fel nem dolgozott fak listaja(ketelemu parok(koordinatak) listaja), a Ki pa- rameterben az eddigi megoldasokat taroljuk, de mar a megadott kimeneti forma- tumban. A visszateresi ertek a megoldasok listainak listaja n,s,w,e vegu fuggvenyek a megadott iranyban keresis a megoldas folyatatasat, mig satrakkeres mindenfele*) fun satrakkeresn(S,O,(A,B)::Fs,Ki,E)=if checklist(S,A-1) then if checklist(O,B) then if checktav(A-1,B,E) then satrakkeres(modifylist(S,A-1),modifylist(O,B),Fs,TSatrak.n::Ki,(A-1,B)::E) else [] else [] else [] |satrakkeresn(S,O,[],Ki,E)=[] and satrakkeress(S,O,(A,B)::Fs,Ki,E)=if checklist(S,A+1) then if checklist(O,B) then if checktav(A+1,B,E) then satrakkeres(modifylist(S,A+1),modifylist(O,B),Fs,TSatrak.s::Ki,(A+1,B)::E) else [] else [] else [] |satrakkeress(S,O,[],Ki,E)=[] and satrakkeresw(S,O,(A,B)::Fs,Ki,E)=if checklist(S,A) then if checklist(O,B-1) then if checktav(A,B-1,E) then satrakkeres(modifylist(S,A),modifylist(O,B-1),Fs,TSatrak.w::Ki,(A,B-1)::E) else [] else [] else [] |satrakkeresw(S,O,[],Ki,E)=[] and satrakkerese(S,O,(A,B)::Fs,Ki,E)=if checklist(S,A) then if checklist(O,B+1) then if checktav(A,B+1,E) then satrakkeres(modifylist(S,A),modifylist(O,B+1),Fs,TSatrak.e::Ki,(A,B+1)::E) else [] else [] else [] |satrakkerese(S,O,[],Ki,E)=[] and satrakkeres(S,O,[],Ki,E)=if checkmegoldas(S) then if checkmegoldas(O) then [rev Ki] else [] else []| satrakkeres(S,O,(A,B)::Fs,Ki,E)=satrakkeresn(S,O,(A,B)::Fs,Ki,E)@satrakkeress(S,O,(A,B)::Fs,Ki,E)@satrakkeresw(S,O,(A,B)::Fs,Ki,E)@satrakkerese(S,O,(A,B)::Fs,Ki,E); (*A megadott fuggveny, a feladatban megadott a parameterezese es a visszateresi erteke*) fun satrak(Ss,Os,Fs)=satrakkeres(beszurmind(Ss),beszurmind(Os),Fs,[],[]);