BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus alapszak |
Nappali tagozat
2012/2013-as tanév, tavaszi félév
|
A feladat a félévi nagy házi feladathoz kapcsolódik, az ott megadott definíciók ismeretét feltételezzük.
Egy k cellaméretű Sudoku-feladványban egy adott mezőre nézve távolságinfók szerint megengedettnek nevezünk egy, az 1..k*k intervallumba eső v egész értéket, ha v eleget tesz az adott mezőre előírt összes távolságkorlátnak. Vagyis ha az adott mezőre és egy oldalszomszédjára fennáll egy i értékű távolságkorlát, és az oldalszomszédra adott egy j értékű száminfó, akkor a távolságkorlát szerint v=j+i vagy v=j-i. Végül azt mondjuk, hogy a v értéket távolságinfó tiltja, ha v nem megengedett a távolságinfók szerint.
A feladat annak megállapítása, hogy egy Sudoku-feladvány adott mezőjében valamely mezőérték előfordulását tiltja-e az adott mezőre és valamely oldalszomszédjára vonatkozó távolságinfó.
A Sudoku-feladványt a nagy házi feladatban specifikált Prolog-struktúrával,
illetve Erlang-párral írjuk le. A vizsgálandó mezőt a koordinátáival, a vizsgálandó
értéket egy egész számmal adjuk meg. A koordináták és a vizsgálandó érték
helyességét ellenőrizni nem kell, feltehetjük, hogy mind a koordináták,
mind a mezőérték az 1..k*k
tartományba esnek.
t_tiltott/4
néven (ahol t_tiltott a
távolságinfó_tiltott rövidítése), amely megvizsgálja, hogy tiltja-e
távolságinfó valamely érték előfordulását egy Sudoku-feladvány adott mezőjében.
% :- type xcoord == int.
% :- type ycoord == int.
% :- type value == int.
% :- pred t_tiltott(sspec::in, xcoord::in, ycoord::in, value::in).
% t_tiltott(+SSpec, +X, +Y, +V), ahol
% SSpec az sspec specifikációnak megfelelő Sudoku-feladvány, X a xcoord,
% Y a ycoord típusnak megfelelő koordináta, V pedig int típusú mezőérték.
% t_tiltott sikeresen lefut, ha az SSpec feladvány (X,Y) koordinátájú mezőjében
% a V érték előfordulását egy SSpec-beli távolságinfó tiltja, azaz az adott
% mezőre és egy szomszédjára fennáll egy I értékű távolságkorlát, miközben
% az adott szomszéd mező J értékű száminfót tartalmaz és |J-V| \= I.
t_tiltott/4
néven (ahol t_tiltott a
távolságinfó_tiltott rövidítése), amely megvizsgálja, hogy tiltja-e
távolságinfó valamely érték előfordulását egy Sudoku-feladvány adott mezőjében.
%% @type xcoord() = integer().
%% @type ycoord() = integer().
%% @type value() = integer().
%% @spec khf2:t_tiltott(SSpec::sspec(), X::xcoord(), Y::ycoord(), V::value()) -> Answer::bool()
% Answer
= true
, ha az SSpec feladvány (X,Y) koordinátájú mezőjében
% a V érték előfordulását egy SSpec-beli távolságinfó tiltja, azaz az adott
% mezőre és egy szomszédjára fennáll egy I értékű távolságkorlát, miközben
% az adott szomszéd mező J értékű száminfót tartalmaz és |J-V| \= I.
A programot tartalmazó modul attribútumai ezek legyenek:
-module(khf2). -author(szerzo@hol.hu) -vsn('year-mm-dd'). -export([t_tiltott/4]).
| ?- [user]. % consulting user... | feladvany1(s(2, [[ [], [s(1),v(3)], [s(1),v(2)], []], [ [s(2)], [s(1)], [w(1),v(3)], [w(2)]], [ [], [s(3)], [], []], [ [], [v(4)], [], []]])). % consulted user in module user, 10 msec 512 bytes | ?- feladvany1(_F), t_tiltott(_F, 1, 1, 3). no | ?- feladvany1(_F), t_tiltott(_F, 2, 2, 1). yes | ?- feladvany1(_F), t_tiltott(_F, 4, 2, 2). yes | ?- feladvany1(_F), t_tiltott(_F, 2, 3, 3). yes | ?- feladvany1(_F), t_tiltott(_F, 3, 2, 1). no | ?- feladvany1(_F), t_tiltott(_F, 3, 2, 2). yes | ?- t_tiltott(s(2, [[ [v(2),s(1)], [w(2)], [], []], [ [], [], [], [s(3)]], [ [s(1)], [], [v(3)], [v(2)]], [ [w(2)], [s(1)], [], []]]), 4, 2, 1). yes
1> F0 = {2,[[ [], [{s,1},{v,3}], [{s,1},{v,2}], []], [ [{s,2}], [{s,1}], [{w,1},{v,3}], [{w,2}]], [ [], [{s,3}], [], []], [ [], [{v,4}], [], []]]}. 2> khf2:t_tiltott(F0, 1, 1, 3). false 3> khf2:t_tiltott(F0, 2, 2, 1). true 4> khf2:t_tiltott(F0, 4, 2, 2). true 5> khf2:t_tiltott(F0, 2, 3, 3). true 6> khf2:t_tiltott(F0, 3, 2, 1). false 7> khf2:t_tiltott(F0, 3, 2, 2). true 8> khf2:t_tiltott( {2, [[ [{v,2},{s,1}], [{w,2}], [], []], [ [], [], [], [{s,3}]], [ [{s,1}], [], [{v,3}], [{v,2}]], [ [{w,2}], [{s,1}], [], []]]}, 4, 2, 1). true
A programot az Elektronikus
Tanársegéd (ETS) segítségével weben keresztül lehet beadni, a HF
beadás menüpont alatt. Ez a kettes számú kis
házi feladat, ennek megfelelően az ETS a beküldött megoldást
khf2.pl
, ill. khf2.erl
néven tárolja el és hivatkozik rá.
(A feltöltendő állomány neve tetszőleges lehet, az ETS átnevezi.)
A vizsgaosztályzat megállapításakor a határidőre beadott, minden tesztesetre helyesen működő feladatmegoldásért plusz 1-1 pont jár.