Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2011, 13:16   #1
FILA
Новичок
Джуниор
 
Регистрация: 14.06.2011
Сообщений: 2
По умолчанию Судоку

Народ!! помогите пожалуйста с прогой, которая решает СУДОКУ. Алгоритм решения есть. она все решает, но есть маленький нюанс...хочеться сделать чтобы можно было бы выбирать уровни сложности. Подскажите, пожалуйста, как это можно сделать.

вот код всей проги:
Код:
type
  TSudoku = array[1..9,1..9] of byte;


var
  Sud:TSudoku;
  Ans:array of TSudoku;
  CEdits:array[1..9,1..9] of TEdit;
  cmbMode:TComboBox;

function sudInLine(s:TSudoku;p:TPoint;v:integer):boolean;
var
  i:1..9;
begin
  Result:=True;
  for i:=1 to 9 do
    if p.y<>i then
      if s[p.X,i]=v then Exit;
  Result:=False;
end;

function sudInRow(s:TSudoku;p:TPoint;v:integer):boolean;
var
  i:1..9;
begin
  Result:=True;
  for i:=1 to 9 do
    if p.x<>i then
      if s[i,p.Y]=v then Exit;
  Result:=False;
end;

function sudInSq(s:TSudoku;p:TPoint;v:integer):boolean;
var
  ix,iy:0..8;
  lx,ly:0..8;
begin
  lx:=0; ly:=0;
  if p.x in [1,2,3] then lx:=1;
  if p.x in [4,5,6] then lx:=4;
  if p.x in [7,8,9] then lx:=7;
  lx:=lx-1;
  if p.y in [1,2,3] then ly:=1;
  if p.y in [4,5,6] then ly:=4;
  if p.y in [7,8,9] then ly:=7;
  ly:=ly-1;
  Result:=True;
  for ix:=1 to 3 do
    for iy:=1 to 3 do
      if (p.x<>lx+ix) and (p.y<>ly+iy) then
        if s[lx+ix,ly+iy]=v then Exit;
  Result:=False;
end;

function sudInAny(s:TSudoku;p:TPoint;v:integer):boolean;
begin
  Result:=sudInLine(s,p,v) or sudInRow(s,p,v) or sudInSq(s,p,v);
end;

function IsNextUnknown(s:TSudoku;var p:TPoint):boolean;
var
  ix,iy:1..9;
begin
  Result:=False;
  for ix:=1 to 9 do
    for iy:=1 to 9 do
      if s[ix,iy]=0 then begin
        Result:=True;
        p.X:=ix;
        p.Y:=iy;
        Exit;
      end; // if
end;

function sudMod(s:TSudoku;p:TPoint;v:integer):TSudoku;
var
  st:TSudoku;
begin
  st:=s;
  st[p.x,p.y]:=v;
  Result:=st;
end;

procedure sudAddAns(s:TSudoku);
var
  l:integer;
begin
  l:=Length(ans);
  SetLength(ans,l+1);
  ans[l]:=s;
end;

function DoRec(s:TSudoku):boolean;
var
  i:integer;
  p:TPoint;
begin
  Result:=True;
  if IsNextUnknown(s,p) then begin 
    for i:=1 to 9 do
      if not sudInAny(s,p,i) then
        if DoRec(sudMod(s,p,i)) then
          Exit;
  end else begin 
    sudAddAns(s);
  end;
  if Length(ans)<mlen then 
    Result:=False;
end; // DoRec

procedure TForm1.ReadInSud;
var
  ix,iy:integer;
  CEdit:TEdit;
begin
  for iy:=1 to 9 do
    for ix:=1 to 9 do begin
      CEdit:=CEdits[ix,iy];
      if CEdit.Text = '' then
        Sud[ix,iy]:= 0
      else
        Sud[ix,iy]:=StrToInt(CEdit.Text);
    end; // for
end;

function IsValidSudoku(s:TSudoku):boolean;
var
  ix,iy:integer;
  p:TPoint;
begin
  for ix:=1 to 9 do
    for iy:=1 to 9 do begin
      p.X:=ix;
      p.Y:=iy;
      if s[ix,iy] <> 0 then
        if sudInAny(s,p,s[ix,iy]) then begin
          Result:=False;
          Exit;
        end; // if
    end; // for
  Result:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ix,iy:integer;
begin
  for iy:=1 to 9 do
    for ix:=1 to 9 do begin
      CEdits[ix,iy]:=TEdit.Create(self);
      with CEdits[ix,iy] do begin
        Parent:=self;
        Left:= (ix - 1) * 30 + 5;
        Top:= (iy - 1) * 30 + 5;
        Width:= 25;
        Color:=clwhite;;
        MaxLength:= 2;
        Ctl3D:= false;
        OnKeyPress:=EditKeyPress;
      end; 
    end; 
end;

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
var
  ci:integer;
  ix,iy:integer;
  CEdit:TEdit;
begin
  for iy:=1 to 9 do
    for ix:=1 to 9 do 
      if Sender is TEdit then
        if (Sender as TEdit)=CEdits[ix,iy] then
          CEdit:=CEdits[ix,iy];
  if (Sender as TEdit)=CEdits[9,9] then
    Exit;
  if Pos(Key,'0123456789'#8) = 0 then
    Key:= #0;
  if Key <> #8 then begin
    ci:=CEdit.ComponentIndex;
    (self.Components[ci+1] as TEdit).SetFocus;
  end; 
end;




procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Pen.Width:=3;
  Canvas.MoveTo(2,2);
  Canvas.LineTo(272,2);
  Canvas.LineTo(272,266);
  Canvas.LineTo(2,266);
  Canvas.LineTo(2,2);
  Canvas.Pen.Width:=2;
  Canvas.MoveTo(2,88+2);
  Canvas.LineTo(272,88+2);
  Canvas.MoveTo(2,88*2+2);
  Canvas.LineTo(272,88*2+2);
  Canvas.MoveTo(90+2,2);
  Canvas.LineTo(90+2,266);
  Canvas.MoveTo(90*2+2,2);
  Canvas.LineTo(90*2+2,266);

end;

end.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 14.06.2011 в 16:20.
FILA вне форума Ответить с цитированием
Старый 14.06.2011, 14:58   #2
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
выбирать уровни сложности
все просто нарисуйте судоку, а потом некоторые кубики очистите и чем выше уровень чем больше кубиков надо очистить
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 20.09.2013, 22:48   #3
crystalbit
ГОСТ 2.403-75
Пользователь
 
Аватар для crystalbit
 
Регистрация: 04.05.2009
Сообщений: 92
По умолчанию

Код не автора, а взят из моей статьи 2009 года: http://parsers.info/2009/03/reshaem-...hi-7-statejka/
По теме: довольно странно выбирать уровень сложности в программе, которая РЕШАЕТ судоку. Люди видно не совсем даже понимают, какой код копируют.

По моей ссылке подробное описание алгоритма, реализованного в приведённом выше коде. Да будет полезно тому, кто случайно забредёт в эту тему, ища материалы по решению судоку
мой скромный delphi блог
crystalbit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
судоку sergio11 C# (си шарп) 8 09.04.2011 21:33
программа судоку valli Помощь студентам 6 22.07.2010 15:03
Судоку zmey31313 Софт 7 13.05.2010 16:12
Delphi судоку fawr Помощь студентам 4 18.03.2010 23:58
Создание судоку Beliuk Паскаль, Turbo Pascal, PascalABC.NET 3 18.03.2010 16:15