Судоку алгоритмін құрастыру (программасын жазу)

Programming Solutions /
Ощм былай ғо, мана, кеше, өткенде судоку шешкім келіп гуглдатып едім, мына сайтқа тап болдым. Ол сайтта судоку автоматты түрде генерацияланады екен. (бұл сайт Судоку генерировать ететін сайттардың алды да арты да емес әрине, жәй мысал ретіде), ощм енді сол программаны өзім жазып көрейіндеп жатырмын, сұмдық қызық болатын сияқты. Сол сонымен бірге жазайық ептілер. Кез келген программалау тілінде жазып көрсетсеңіздер болады.

Қиын болып жатса бірінші 6x6 судокудан бастаңыздар. Сосын 9x9 ға көшіңдер. Ал іске сәт. Маған да )

6x6


9x9


Бәрі шығарылып, оңай болып жатса, судокуды шешіп беретін бағдарламаға да жетерміз әлі ;)

20 пікір

yerbol89
Шынымды айтсам осы ойынды қалай ойнайтынын да білмедім! :) Жарықтық тіпті ақ-қара экранды нокиа телефонында да болатын еді осы ойын. Бірақ ешкім қалай ойнау керегін үйретпеген. Мен қызықпадым. Сол ойнау жолын үйретіп жіберсеңіздер.
AL-ASTER
3*3 ұяшықты 1..9 сандарымен толтыру керек және ұяшықта сандар қайталанбайы керек, сонымен қатар ол сандар жалпы клеткалардың горизонталь, вертикаль бағытында да қайталанбауы керек.
AKA
Ух ты, басты жұмыс істетудің бір жолы. Мен ойнайтынмын, кішкентай журналдары да сақтаулы үйде. :) Ал, сәттілік бастамаларыңызға.
qyrmyzy
вооох, керемет. Сіңілім джынд ойнайды. Кішкентай бірдеңі көтереді де жүреді. Сөйтсем, осы ойын екен. Маддис!Кімнің күні???
p689606
Мектеп атынан олимпиадада 1..4 түске дейінгі кубик-рубикті қанша қадаммен толық құрастыруға болатынын және берілген 8 орынды 9 рет берілетін санның 10-шысын есептеп шығаратын программа құрып, жеңіп шықтым да, сөйтсем өзім сияқты малюткаларды жеңіппін, келесі турда жыртқыштармен жарысам деп жыртылып қалдым)))
ereke_enu
Мен де қосылдым онда… Гуглдау жоғынан)
Abylai
ия гуглдау жоқ, қазір енді кірісейіндеп жатырмын, іске сәт.
ereke_enu
Емааа, бүкіл кодты салсам текст быт-шыт болып кетеді екен. Ең маңызды екі функцияны орната қояйын, қатем болса айтарсыңдар…

//Берілген санды баған және жол бойынша тексеріп шығады
private static bool CheckInLines(int r, int c, int a)
{
int k = 0;
for (int i = 0; i < 9; i++)
if ((arr[r][i] == a) || (arr[i][c] == a))
{
k++;
}
bool res = k == 0? true: false;
return res;
}


//бір 3*3 ұяшықтың ішінде тексереді
private static bool CheckInField(int r, int c, int a)
{
int r0 = (r / 3) * 3;
int c0 = (c / 3) * 3;
int k = 0;
for (int j = 0; j < 3; j++)
{
for (int i = 0; i < 3; i++)
{
if (arr[r0 + j][c0 + i] == a)
{
k++;
}
}
}
bool res = k == 0? true: false;
return res;
}

Айтпақшы массив 9*9 — arr
AL-ASTER
Amigo, .exe v studiu!
ereke_enu
Соны мен де күтіп отырмын)))
Abylai
иә .exe болса күшті болар еді, кодтты елестете алмай отырмын
Abylai
лібәәәә if пен while нің екіжүзқызықбесін жаздым щщс, шықпай жатыр, қазір
AL-ASTER
(ужыс 2010 си шарпты орнату керек қазір ХРмен отырм, ол болса севенге отырад)
Мен параққа шығардым алгоритмі мен қазақша версиясын, бырак соншама іф пен уайл колдануга ерынемын, кстати мен ерыншекпын катты сол ушын ен кыска жолын ойлап жатырмын)
MSHERIMBEK
ойнауды білмеймін. сондықтан түк те түсінбей отырған пақыр күйімді кешіріп қойың:)
Abylai
шөбіңнен әкелш, шықпай зацикливаться етіп жатыр
followme_alik
лібә C-y P-e ))
program sudoku;
const
maxsol=100;
type
tcell=record
nv:longint;
v:array[1..9] of longint;
end;
tfield=array[0..80] of tcell;
var
field:tfield;
vars9,vars0:tcell;
i,j,nsol:longint;
ch:char;
flg:boolean;
procedure print_ans;
var
i,j,k:longint;
begin
for i:=0 to 8 do begin
for j:=0 to 8 do
with field[i*9+j] do
if nv>1 then
write('0')
else
for k:=1 to 9 do
if v[k]=0 then begin
write(k);
break;
end;
writeln;
end;
writeln;
end;
procedure rem_cell(x,y,vv:longint);
begin
with field[y*9+x] do begin
inc(v[vv]);
if v[vv]=1 then begin
dec(nv);
if nv=0 then
flg:=true;
end;
end;
end;
procedure rem_cells(n,vv:longint);
var
x,y,xx,yy,i,j:longint;
begin
x:=n mod 9;
y:=n div 9;
xx:=(x div 3)*3;
yy:=(y div 3)*3;
for i:=0 to 8 do
if i<>x then
rem_cell(i,y,vv);
for i:=0 to 8 do
if i<>y then
rem_cell(x,i,vv);
for i:=yy to yy+2 do
if i<>y then
for j:=xx to xx+2 do
if j<>x then
rem_cell(j,i,vv);
end;
procedure unrem_cell(x,y,vv:longint);
begin
with field[y*9+x] do begin
dec(v[vv]);
if v[vv]=0 then
inc(nv);
end;
end;
procedure unrem_cells(n,vv:longint);
var
x,y,xx,yy,i,j:longint;
begin
x:=n mod 9;
y:=n div 9;
xx:=(x div 3)*3;
yy:=(y div 3)*3;
for i:=0 to 8 do
if i<>x then
unrem_cell(i,y,vv);
for i:=0 to 8 do
if i<>y then
unrem_cell(x,i,vv);
for i:=yy to yy+2 do
if i<>y then
for j:=xx to xx+2 do
if j<>x then
unrem_cell(j,i,vv);
end;
procedure solve(n:longint);
var
i:longint;
sc:tcell;
begin
if n=81 then begin
print_ans;
inc(nsol);
if nsol=maxsol then
halt;
exit;
end;
sc:=field[n];
with field[n] do
for i:=1 to 9 do
if v[i]=0 then begin
flg:=false;
rem_cells(n,i);
if not flg then begin
field[n]:=vars0;
nv:=1;
v[i]:=0;
solve(n+1);
field[n]:=sc;
end;
unrem_cells(n,i);
end;
end;
procedure do_rem(var f:tfield);
var
x,y,i:longint;
begin
for y:=0 to 8 do
for x:=0 to 8 do
with f[y*9+x] do
if nv=1 then
for i:=1 to 9 do
if v[i]=0 then begin
rem_cells(y*9+x,i);
break;
end;
end;
begin
vars9.nv:=9;
vars0.nv:=0;
for i:=1 to 9 do begin
vars9.v[i]:=0;
vars0.v[i]:=1000;
end;
for i:=0 to 80 do
field[i]:=vars9;
for i:=0 to 8 do begin
for j:=0 to 8 do begin
read(ch);
if ch<>'0' then begin
field[i*9+j]:=vars0;
with field[i*9+j] do begin
nv:=1;
v[ord(ch-'0')]:=0;
end;
end;
end;
readln;
end;
flg:=false;
do_rem(field);
nsol:=0;
if not flg then
solve(0);
if nsol=0 then
writeln('There is no solution.');
end
Abylai
мына программаң қандай нәтиже қайтарады? менің интерпретаторымда шықпай жатыр мына код
ereke_enu
Гуглдамауға келісіп едік қой. Оның өзінде бұл қате код
Jako
Құдайым-ау, мына жақ не боп кеткен,қой қаштым…
Тек тіркелген қолданушылар ғана пікір қалдыра алады.