BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus szak |
Nappali tagozat
2012/2013-es tanév, őszi félév
|
Sudoku-mátrixnak hívunk egy olyan négyzetes mátrixot, amelyben a sorok (és az oszlopok) száma egy k2 ≥ 1 négyzetszám. (Tehát a mátrix elemeinek száma k4.)
Egy Sudoku-mátrixban cellának hívunk egy olyan (folytonos) részmátrixot, amely k sorból és k oszlopból áll, és bal felső sarkának sor- ill. oszlopsorszáma i*k+1 ill. j*k+1, ahol 0 ≤ i,j ≤ k-1 (a sorokat és oszlopokat 1-től számozzuk).
Tehát egy Sudoku-mátrix k2 darab diszjunkt cellára bontható szét. A cellákat a bal felső sarkuk (R, C) sor-oszlop koordinátapárjai lexikografikus rendezésének megfelelően rakjuk sorba, és látjuk el egy 1 és k2 közötti sorszámmal (R ill. C a bal felső sarok sorának ill. oszlopának száma). Másképpen mondva a cellákat sorfolytonosan számozzuk, 1-től kezdve.
A Sudoku-mátrix elemeit az alábbiakban mezőknek is nevezzük.
Az S Sudoku-mátrixot egy olyan (Prolog ill. Erlang) listaként adjuk meg, amelynek i. eleme a mátrix i. sorának mezőit tartalmazó lista.
A C eredményt egy olyan lista formájában várjuk, amely a keresett cella mezőinek értékét oszlopfolytonosan tartalmazza.
A Sudoku-mátrix mezőinek típusa és értéke a jelen feladat szempontjából érdektelen, de az alábbi specifikációkban úgy tekintjük, hogy a mezők egész számok.
Feltételezheti, hogy
cella/3
néven, amely egy
Sudoku-mátrixból egy adott sorszámú cellát vág ki, és a fent specifikált
módon adja vissza.
% :- type field == int.
% :- type board == list(list(field)).
% :- pred cella(board::in, int::in, list(field)::out).
% cella(S, I, C): C egy olyan lista, amely az S Sudoku-mátrix I.
% cellájának elemeit oszlopfolytonosan tartalmazza.
Megjegyzés: Az is/2
beépített eljárás alábbi hívásával lehet egy
M
négyzetszám gyökét egész számként a K
változóban
előállítani:
K is integer(sqrt(M)).
cella/2
néven, amely egy
Sudoku-mátrixból egy adott sorszámú cellát vág ki, és a fent specifikált
módon adja vissza.
%% @type field() = integer().
%% @type board() = [[field()]].
%% @spec khf1:cella(S::board(), I::integer()) -> C::[field()].
%% C egy olyan lista, amely az S Sudoku-mátrix I.
%% cellájának elemeit oszlopfolytonosan tartalmazza.
A programot tartalmazó modul két attribútuma ez legyen:
-module(khf1). -export([cella/2]).
| ?- cella([[6]], 1, C). C = [6] ? ; no
| ?- cella([[6,2,3,4], [9,7,8,3], [1,4,5,7], [4,6,1,2]], 4, C). C = [5,1,7,2] ? ; no
| ?- cella([[0,8,0,2,3,4,1,0,5], [0,0,9,0,5,0,4,0,1], [8,0,0,2,9,6,1,0,4], [0,2,1,7,8,0,0,0,0], [0,3,9,0,5,7,2,0,7], [0,4,0,8,2,9,6,1,3], [0,1,0,9,0,5,0,4,0], [0,5,0,6,0,2,7,3,9], [0,0,0,0,0,0,0,0,0]], 6, C). C = [0,2,6,0,0,1,0,7,3] ? ; no
1> khf1:cella([[0]], 1). [0]
2> khf1:cella([[6,2,3,4], [9,7,8,3], [1,4,5,7], [4,6,1,2]], 2). [3,8,4,3]
3> khf1:cella([[0,8,0,2,3,4,1,0,5], [0,0,9,0,5,0,4,0,1], [8,0,0,2,9,6,1,0,4], [0,2,1,7,8,0,0,0,0], [0,3,9,0,5,7,2,0,7], [0,4,0,8,2,9,6,1,3], [0,1,0,9,0,5,0,4,0], [0,5,0,6,0,2,7,3,9], [0,0,0,0,0,0,0,0,0]], 4). [0,0,0,2,3,4,1,9,0]
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 az egyes számú kis
házi feladat, ennek megfelelően az ETS a beküldött megoldást
khf1.pl
, ill. khf1.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.