Програмка решающая судоку - Pascal
Формулировка задачи:
Доброе время суток!
В програмирование я совсем зеленый. Задали такую задачку - написать в паскале программу, которая генерируте судоку, а потом его сама решает. С превой частью я кое как справился , возможно не самый рациональный вариант, но как умею. Программа генерирует судоку на поле 4x4. Но с решением судоку у меня ничего не получилось.. Подскажите пожалуйста алгоритм, который можна реализовать в пасале или весь код программы..
В принципе я понимаю, надо найти в массиве ноль и вписать в эту координату число командой random(5). Потом проверить встречается ли это число по горизнотали и вертикали, если нет - то число оставляю, если да - то прыгаю на random(5), который генерирует другое число, и проверка начинается с начала. В паскале у меня это сделать никак не получается... Помогите пожалуйста..если не по этому, так по другому алгоритму найти решение.
Вот код, который генерирует судоку на поле 4x4. Написал как умел
uses crt; label 1,2,3,4; type mas=array[1..4,1..4]of longint; var s:mas; m:mas; i,j,l,chis,k,a,b,c1,c2:longint; prav:boolean; begin clrscr; randomize; prav:=false; k:=0; for j:=1 to 4 do begin while not prav do begin chis:=random(5); if (chis=0) then prav:=false else begin for l:=1 to 4 do if s[1,l]=chis then k:=k+1; if k>0 then prav:=false else begin s[1,j]:=chis; prav:=true; end; k:=0; end; end; prav:=false; end; for j:=1 to 4 do s[2,j]:=s[1,4-j+1]; for i:=3 to 4 do for j:=1 to 4 do begin if (i mod 2)=0 then if j>=3 then s[i,j]:=s[2,4-j+3] else s[i,j]:=s[2,4-j-1] else if j>=3 then s[i,j]:=s[1,4-j+3] else s[i,j]:=s[1,4-j-1] end; for i:=1 to 4 do begin for j:=1 to 4 do write(s[i,j]:2); writeln; end; readln; for i:=1 to 2 do begin for j:=1 to 2 do 1:a:=random(3); b:=random(3); if (a=0) or (b=0) then goto 1 else s[a,b]:=0; s[b,a]:=0; end; for i:=1 to 2 do begin for j:=3 to 4 do 2:a:=random(3); b:=random(5); if (a=0) or (b=0) or (b<3) then goto 2 else s[a,b]:=0; s[b,a]:=0; end; for i:=3 to 4 do begin for j:=3 to 4 do 3:a:=random(5); b:=random(5); if (a=0) or (b=0)or (a<3) or (b<3) then goto 3 else s[a,b]:=0; s[b,a]:=0; end; for i:=3 to 4 do begin for j:=1 to 2 do 4:a:=random(5); b:=random(3); if (a<3) or (j>2) or (a=0) or (b=0) then goto 4 else s[a,b]:=0; s[b,a]:=0; end; for i:=1 to 4 do begin for j:=1 to 4 do write(s[i,j]:2); writeln; end; readln; end.
Решение задачи: «Програмка решающая судоку»
textual
Листинг программы
for i:=1 to 4 do begin for j:=1 to 4 do if s[i,j]=0 then begin a:=random(4)+1; for c2:=1 to 4 do for c1:=1 to 4 do if (a<>s[i,c2]) and (a<>s[c1,j]) then begin s[i,j]:=a; writeln(s[i,c2]); end; end; end;
Объяснение кода листинга программы
- В цикле
for i:=1 to 4 do
происходит итерация от 1 до 4. - Внутри цикла
for j:=1 to 4 do
происходит итерация от 1 до 4, но только для переменнойj
. - В условии
if s[i,j]=0
проверяется равенство элементаs[i,j]
нулю. - Если условие истинно, то генерируется случайное число от 1 до 4 с помощью функции
random(4)+1
. - Для каждой позиции
c1
иc2
в массивеs[i,]
происходит проверка на уникальность значенияa
среди всех элементовs[i,c1]
иs[i,c2]
. - Если условие истинно, то значение
a
присваивается элементуs[i,j]
. - Значение
a
выводится на экран с помощью функцииwriteln(s[i,c2])
. - Цикл
for c1:=1 to 4 do
иfor c2:=1 to 4 do
выполняются для каждой позицииc1
иc2
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д