Судоку на делфи

Тема в разделе "Delphi - FAQ", создана пользователем Killerkod, 18 апр 2010.

  1. Killerkod

    Killerkod Гость

    В общем суть такова, получил задание, написать программу, которая будет решать судоку. Просто тупо программу с 81 клеткой, и при нажатии кнопки чтоб все клетки правильно заполнялись.
    Вроде написал...
    Исходник приложил.
    Вроде заполняет, все правильно.. но остаются нули, которые она заполнить не может, т.к. уже будет неверно... Т.е. расположение цифр идет неверное... Гланьте сорс, помогите решить... Желательно с пояснениями)))
    П.С. прошу не предлагать чужие сорсы, мне самому охото написать... чтоб полностью понять это...


    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;


    var
    CEdits:array[1..9,1..9] of TEdit;
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    i1,i2:integer;
    begin
    for i2:=1 to 9 do
    for i1:=1 to 9 do begin
    CEdits[i1,i2]:=TEdit.Create(self);
    with CEdits[i1,i2] do begin
    Parent:=self;
    Left:= (i1 - 1) * 25 + 5;
    Top:= (i2 - 1) * 25 + 5;
    Width:= 20;
    Text:='0';
    end;
    end;
    end;

    function sudInSq(x,y,ch:integer):boolean;
    var
    ix,iy:0..8;
    lx,ly:0..8;
    begin
    lx:=0; ly:=0;
    if x in [1,2,3] then lx:=1;
    if x in [4,5,6] then lx:=4;
    if x in [7,8,9] then lx:=7;
    lx:=lx-1;
    if y in [1,2,3] then ly:=1;
    if y in [4,5,6] then ly:=4;
    if 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 (x<>lx+ix) and (y<>ly+iy) then
    if Cedits[lx+ix,ly+iy].text=IntToStr(ch) then Exit;
    Result:=False;
    end;


    function prov_lin(x, ch:integer):boolean;
    var
    i:integer;
    begin
    for i:=1 to 9 do     //1
    begin
    if Cedits[x,i].text= IntToStr(ch) then //2
    begin
    Result:=true;
    Exit;
    end;  //2
    end;//1
    Result:=false;
    end;

    function prov_st(ch, y:integer):boolean;
    var
    i:integer;
    begin
    for i:=1 to 9 do     //1
    begin
    if Cedits[i,y].text= IntToStr(ch) then //2
    begin
    Result:=true;
    Exit;
    end;  //2
    end;//1
    Result:=false;
    end;

    function prov_all(ch,x,y:integer):boolean;
    begin
    result:= prov_lin(x,ch) or prov_st(ch, y) or sudInSq(x,y,ch);
    end;

    procedure zapis(x,y:integer);
    var
    i:integer;
    begin
    for i:=1 to 9 do begin
    if not prov_all(i,x,y) then
    Cedits[x,y].Text:=IntToStr(i);
    end;
    end;

    procedure poisk;
    var
    x,y,i:integer;
    begin
    for x:=1 to 9 do
    for y:=1 to 9 do
    if cedits[x,y].Text='0' then
    zapis(x,y);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    poisk;
    end;

    procedure TForm1.FormPaint(Sender: TObject);
    begin
    Canvas.Pen.Width:=3;
    Canvas.MoveTo(1,1);
    Canvas.LineTo(228,1);
    Canvas.LineTo(228,230);
    Canvas.LineTo(1,230);
    Canvas.LineTo(1,1);
    Canvas.Pen.Width:=2;
    Canvas.MoveTo(1,75+2);
    Canvas.LineTo(228,75+2);
    Canvas.MoveTo(2,75*2+2);
    Canvas.LineTo(228,75*2+2);
    Canvas.MoveTo(75+2,1);
    Canvas.LineTo(75+2,230);
    Canvas.MoveTo(75*2+2,2);
    Canvas.LineTo(75*2+2,230);

    end;

    end.
     
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Похожая тема уже открывалась(посмотри в коментариях, там есть ссылка на то как их решать)

    P.S. Пользуйтесь поиском
     
  3. crystalbit

    crystalbit New Member

    Регистрация:
    22 фев 2010
    Сообщения:
    1
    Симпатии:
    0
    конечно)
    Код в первом сообщении взят из моей статьи: http://parsers.info/2009/03/reshaem-sudoku...phi-7-statejka/
    Там полное описание алгоритма и рабочий исходник.
    Вдруг кто забредёт в эту тему, полезно будет
     
Загрузка...
Похожие Темы - Судоку на делфи
  1. Logical
    Ответов:
    10
    Просмотров:
    3.575
  2. VahaC
    Ответов:
    18
    Просмотров:
    14.320
  3. Kaiser
    Ответов:
    0
    Просмотров:
    7
  4. maliy
    Ответов:
    4
    Просмотров:
    48
  5. DoberGroup
    Ответов:
    0
    Просмотров:
    25

Поделиться этой страницей