• Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, извините, что побеспокоил, уже разобрался
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, добрый день, вот пофиксил уже почти все возможные баги, но один всё-таки остаётся: при нажатии на крестик у MessageDlg далее программа может вести себя некорректно, можно как-то сделать крестик закрытия MessageDlg неактивным?
    if CountForCorrect <> QueensCount * QueensCount then
        buttonSelected := MessageDlg('Unfortunately, you did not place all the queens with hints. Do you want to try again?', mtInformation, [mbYes, mbNo], 0);
      if buttonSelected = mrYes then
      //...
  • Как исправить ошибку E2066?

    @Alertoso Автор вопроса
    zedxxx, ArrI[i] := Random(Row);
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, понял, а я вот подумал, чтобы ограничить пользователя в том, чтобы он не мог по тысячу раз щёлкать на кнопку "Start", типо 1 клик в 1 секунду допустить, это можно как-то сделать?
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, добрый день, а в чём преимущество дженериков в задаче о ферзях?
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    A K, так что насчёт того предложения? Я могу скинуть фулл программу сюда кодом и вы скажете: да или нет.
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    A K, а вообще, очень нужно(прям очень) работу(эти процедуры из той работы, сам код = 480 строк) одну прокомментировать и помочь разобраться до 5 мая, готов даже заплатить...
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    A K, ааа, в drawCircle вызывается процедура drawCircleSIm(рисование круга), а после неё происходит закрашивание куга?
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    Самый главный момент, зачем drawCircle, когда уже есть drawCircleSim, вот это мне вообще непонятно...
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    longclaps, там точно он реализован? Я просто видел где-то на ассемблере этот алгоритм в строк 100, а тут под 200...
  • Можете, пожалуйста, прокомментировать код?

    @Alertoso Автор вопроса
    longclaps, я забыл ответить, занят был олимпой по матеше), а так да, я переделал так, как предложили Вы
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, поговорил с лектором, он сказал оставить это, насчёт букв, как можно их сделать чётче?
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, ну да, действительно, так он ещё и начинает как-то странно, с 7 столбца, потом 6 столб и так далее...
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, она расставляет ферзей, начиная с 7 столбца, потом нарастает до 1 столбца
    procedure RecursiveSolution(RestoreLastSolution: boolean = false);
    var
      i: Integer;
      a: array [1 .. MaxQueensCount] of Boolean;                            // a[j] - на j-й горизонтали ферзя нет
      b: array [2 .. 2 * MaxQueensCount] of Boolean;                        // b[k] - на k-й / диагонали ферзя нет (у всех полей на диагонали / постоянна сумма координат i и j)
      c: array [1 - MaxQueensCount .. MaxQueensCount - 1] of Boolean;       // c[k] - на k-й \ диагонали ферзя нет (у всех полей на диагонали \ постоянна разность координат i и j)
      x: array [1 .. MaxQueensCount] of Integer;                            // x[i] - местоположение ферзя на i-й вертикали
    
    procedure Solve(i: Integer);
    var
      j: Integer;
    begin
      if RestoreLastSolution then
      Begin
        if I <> QueensCount then
            Solve(I + 1)
        else
        Begin
         RestoreLastSolution := False;
         Exit;
        End;
      End;
      if not RestoreLastSolution then
      Begin
      if not StopPressed then
      for j := 1 to QueensCount do
      begin
        if a[j] and b[i + j] and c[i - j] then
        begin
          x[i] := j;
          a[j] := False;
          b[i + j] := False;
          c[i - j] := False;
          if i < QueensCount then
          Begin
            Cout1 := j;
            Cout2 := i;
            Solve(i + 1)
          End
          else
            frmMain.DrawSolution(x);
          a[j] := True;
          b[i + j] := True;
          c[i - j] := True;
        end;
      end;
      End;
    end;
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, ну вроде как я понял, мы должны вызвать процедуру Solve с i значения, потом сделать это:
    if RestoreLastSolution then
      Begin
        if I <> QueensCount then
            Solve(i + 1)
        else
        Begin
         RestoreLastSolution := False;
         Exit;
        End;
      End;

    Но в итоге что-то всё равно не идёт:
    procedure RecursiveSolution(RestoreLastSolution: boolean = false);
    var
      i: Integer;
      a: array [1 .. MaxQueensCount] of Boolean;                            // a[j] - на j-й горизонтали ферзя нет
      b: array [2 .. 2 * MaxQueensCount] of Boolean;                        // b[k] - на k-й / диагонали ферзя нет (у всех полей на диагонали / постоянна сумма координат i и j)
      c: array [1 - MaxQueensCount .. MaxQueensCount - 1] of Boolean;       // c[k] - на k-й \ диагонали ферзя нет (у всех полей на диагонали \ постоянна разность координат i и j)
      x: array [1 .. MaxQueensCount] of Integer;                            // x[i] - местоположение ферзя на i-й вертикали
    
    procedure Solve(i: Integer);
    var
      j: Integer;
    begin
      if RestoreLastSolution then
      Begin
        if I <> QueensCount then
            Solve(i + 1)
        else
        Begin
         RestoreLastSolution := False;
         Exit;
        End;
      End;
      if not RestoreLastSolution then
      Begin
      if not StopPressed then
      for j := 1 to QueensCount do
      begin
        if a[j] and b[i + j] and c[i - j] then
        begin
          x[i] := j;
          a[j] := False;
          b[i + j] := False;
          c[i - j] := False;
          if i < QueensCount then
          Begin
            Cout1 := j;
            Cout2 := i;
            Solve(i + 1)
          End
          else
            frmMain.DrawSolution(x);
          a[j] := True;
          b[i + j] := True;
          c[i - j] := True;
        end;
      end;
      End;
    end;
    
    begin
      if not RestoreLastSolution then
      Begin
      for i := 1 to QueensCount do
        a[i] := True;
      for i := 2 to 2 * QueensCount do
        b[i] := True;
      for i := 1 - QueensCount to QueensCount - 1 do
        c[i] := True;
      End;
      if RestoreLastSolution then
      begin
        For i := 1 to QueensCount do
          x[i] := TmpArr[i];
          a[Cout1] := True;
          b[Cout2 + Cout1] := True;
          c[Cout2 - Cout1] := True;
          i:=Cout2;
          Solve(i);
      end;
      Solve(1);
    end;
  • Как можно модифицировать авиа радар?

    @Alertoso Автор вопроса
    longclaps, я прошу прощения, если я сделал что-то не так, я хотел сделать всего лишь вывод пиксельного изображения, но для автомата нужна именно анимация, а здесь я не силён...
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, не до конца понимаю насчёт этих массивов...
    procedure RecursiveSolution(RestoreLastSolution: boolean = false);
    var
      i: Integer;
      a: array [1 .. MaxQueensCount] of Boolean;                            // a[j] - на j-й горизонтали ферзя нет
      b: array [2 .. 2 * MaxQueensCount] of Boolean;                        // b[k] - на k-й / диагонали ферзя нет (у всех полей на диагонали / постоянна сумма координат i и j)
      c: array [1 - MaxQueensCount .. MaxQueensCount - 1] of Boolean;       // c[k] - на k-й \ диагонали ферзя нет (у всех полей на диагонали \ постоянна разность координат i и j)
      x: array [1 .. MaxQueensCount] of Integer;                            // x[i] - местоположение ферзя на i-й вертикали
    
    procedure Solve(i: Integer);
    var
      j: Integer;
    begin
      if not StopPressed then
      for j := 1 to QueensCount do
      begin
        if a[j] and b[i + j] and c[i - j] then
        begin
          x[i] := j;
          a[j] := False;
          b[i + j] := False;
          c[i - j] := False;
          if i < QueensCount then
          Begin
            Cout1 := j;
            Cout2 := i;
            Solve(i + 1)
          End
          else
            frmMain.DrawSolution(x);
          a[j] := True;
          b[i + j] := True;
          c[i - j] := True;
        end;
      end;
    end;
    
    procedure Solve1(i: Integer);
    var
      j: Integer;
    begin
      if i = QueensCount then
        Exit;
      for j := 1 to QueensCount do
      begin
        if a[j] and b[i + j] and c[i - j] then
        begin
          x[i] := j;
          a[j] := False;
          b[i + j] := False;
          c[i - j] := False;
          if i < QueensCount then
            Solve1(i + 1)
          else
            frmMain.DrawSolution(x);
          a[j] := True;
          b[i + j] := True;
          c[i - j] := True;
        end;
      end;
    end;
    
    begin
      if not RestoreLastSolution then
      Begin
      for i := 1 to QueensCount do
        a[i] := True;
      for i := 2 to 2 * QueensCount do
        b[i] := True;
      for i := 1 - QueensCount to QueensCount - 1 do
        c[i] := True;
      End;
      if RestoreLastSolution then
      begin
        For i := 1 to QueensCount do
          x[i] := TmpArr[i];
          a[Cout1] := True;
          b[Cout2 + Cout1] := True;
          c[Cout2 - Cout1] := True;
        Solve1(1);
      end;
      Solve(1);
    end;
  • Как можно оптимизировать код?

    @Alertoso Автор вопроса
    kalapanga, я правильно Вас понял, что всего будет 2 процедуры, и получается восстановить решение(если надо) через 2 процедуру, потом, когда параметр станет равным QueensCount, выйти из неё и запустить процедуру Solve(1)?