Програмка решающая судоку - 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;

Объяснение кода листинга программы

  1. В цикле for i:=1 to 4 do происходит итерация от 1 до 4.
  2. Внутри цикла for j:=1 to 4 do происходит итерация от 1 до 4, но только для переменной j.
  3. В условии if s[i,j]=0 проверяется равенство элемента s[i,j] нулю.
  4. Если условие истинно, то генерируется случайное число от 1 до 4 с помощью функции random(4)+1.
  5. Для каждой позиции c1 и c2 в массиве s[i,] происходит проверка на уникальность значения a среди всех элементов s[i,c1] и s[i,c2].
  6. Если условие истинно, то значение a присваивается элементу s[i,j].
  7. Значение a выводится на экран с помощью функции writeln(s[i,c2]).
  8. Цикл for c1:=1 to 4 do и for c2:=1 to 4 do выполняются для каждой позиции c1 и c2.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы