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

    @kalapanga
    Alertoso, так она же в поиске решения есть проверка такая. Там где типа "если модуль разности строк равен модулю разности колонок то ферзи на одной диагонали". Как-то так примерно. Это если по массиву бежать и каждого уже установленного ферзя с интересующей точкой сравнивать.
    Или можно от интересующей точки пробежать по диагоналям в четыре стороны до границы доски и смотреть, попадётся ли ферзь. Если попался сразу останавливаться.
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, Ну начинааается! Я уж думал, народ таки перестал ssd экономить - а нет, новую тему нашли! Шучу! :)
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, всё в целом вроде правильно пишете, но вот это я совсем не понял:
    я например вынес темп папки рабочий стол и загрузки на другой ссд, файл подкачки тоже, 100 гиг винде вполне хватает, если задрот то и сохраненки тоже можно вынести

    В чём прикол переноса этих папок с одного ssd на другой? Ну если только вам комп/ноут достался именно в таком виде - пара мелких ssd, каждого по отдельности мало и нужно как-то между ними распределиться.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Да, пожалуй и там и там надо рисовать. Или при клике перерисовку всей доски вызывать, что понятное дело хуже. Быстрее попробовали бы! Примерно так надо:
    var
      frmMain: TfrmMain;
      ...
      Queens: array [0..MaxQueensCount-1, 0..MaxQueensCount-1] of boolean;
      img1, img2: TPicture;
    
    procedure TfrmMain.FormCreate(Sender: TObject);
    var
      i, j: Integer;
    begin
      ...
      for i := 0 to MaxQueensCount-1 do
        for j := 0 to MaxQueensCount-1 do
          Queens[i, j] := false;
      img1:= TPicture.Create;
      img1.LoadFromFile('E:\Ферзь 1.bmp');
      img2:= TPicture.Create;
      img2.LoadFromFile('E:\Ферзь 2.bmp');
    end;
    
    procedure TfrmMain.grdChessBoardClick(Sender: TObject);
    var
      CellColor: TColor;
    begin
      Queens[grdChessBoard.Col, grdChessBoard.Row] := not Queens[grdChessBoard.Col, grdChessBoard.Row];
      with grdChessBoard do
        if Queens[grdChessBoard.Col, grdChessBoard.Row] then
        begin
            if (Col + Row) mod 2 = 0 then
              Canvas.StretchDraw(CellRect(Col, Row), img1.Graphic)
            else
              Canvas.StretchDraw(CellRect(Col, Row), img2.Graphic);
        end
        else
        begin
          if ((Col + Row) mod 2) = 0 then
            CellColor := clWhite
          else
            CellColor := clGray;
          grdChessBoard.Canvas.Brush.Color := CellColor;
          grdChessBoard.Canvas.FillRect(CellRect(Col, Row));
        end;
    end;
    
    procedure TfrmMain.grdChessBoardDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      CellColor: TColor;
    begin
      with grdChessBoard do
        if Queens[ACol, ARow] then
        begin
          if (ACol + ARow) mod 2 = 0 then
            Canvas.StretchDraw(CellRect(ACol, ARow), img1.Graphic)
          else
            Canvas.StretchDraw(CellRect(ACol, ARow), img2.Graphic);
        end
        else
        begin
          if ((ACol + ARow) mod 2) = 0 then
            CellColor := clWhite
          else
            CellColor := clGray;
          Canvas.Brush.Color := CellColor;
          Canvas.FillRect(Rect);
        end;
    end;


    Клик по ячейке либо ставит либо убирает ферзя.
    По уму, код рисования ячейки, повторяющийся в двух местах, лучше организовать в отдельную процедурку, которую и вызывать из обоих обработчиков событий.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, вопрос не очень понял. Да, все вместе, в том смысле, что сколько нужно ферзей, столько и будет отображено. И да, поочерёдно, в том смысле, что отрисовка всей сетки состоит из последовательной отрисовки ячеек.
  • Как можно оптимизировать код?

    @kalapanga
    Да, я чего-то и внимания не обратил, что только одна картинка и рисуется.
    Попробуйте следующее:
    1) Нужна структура (массив какой-нибудь) хранящий информацию о клетках доски - есть в ней ферзь или нет. Типа массива в котором сейчас решение формируется или любом каком удобнее, неважно!
    2) В событии OnClick ничего не рисуем, а только определяем в какой ячейке нужно добавить/убрать ферзя и записываем эту информацию в структуре из п.1
    3) А рисуем ферзей в событии OnDrawCell. Там при отрисовке ячейки проверяем не только какого она цвета должна быть, а ещё и проверяем по нашему массиву не нужно ли отобразить в ячейке ферзя. Если нужно - рисуем.
    Вроде по теории так оно должно работать.
  • Как можно оптимизировать код?

    @kalapanga
    Это суметь надо! Процедура TfrmMain.grdChessBoardClick есть, а событию она не назначена.
    В Object Inspector у grdChessBoard вкладку Events глядим - а у OnClick и нету ничего. Куда делось?
    Бывает :) Выбери её тут из списка и всё заработает.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, А чего, у меня всё даже работает. Ни буквы не поменял кроме пути к файлам. Кликаю и либо одну, либо другую бмп-шку рисует. Я тупо из Paint-а два квадратика - синий и красный сохранил. Я было подумал, что может оно с OnDrawCell конфликтует. Но нет, проверил - рисует.
    Файлы-то точно по этому пути лежат?

    Ну и сразу же. Сами переменные img1, img2 и чтение картинок из файла нужно вынести из этой процедуры. Переменные или в саму форму или в глобальные накрайняк. Читать где-нибудь в TfrmMain.FormCreate. Зачем это каждый клик-то делать?
    И про абсолютные пути как раз в этом вопросе уже обсуждали.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, И кстати, если поменять тип у SolutionCount с integer на int64, то можно поставить и MaxQueensCount = 27. (Дальше значения этой последовательности в справочниках всё равно отсутствуют)
    И попробовать уморить компьютер :)
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, А зачем кнопки-то ещё городить? У самого TDrawGrid есть и OnClick, и OnDblClick. В них через свойства грида grdChessBoard.Col и grdChessBoard.Row определяем какую клетку ткнули. Или OnSelectCell использовать, там в параметрах события колонка и строка приходят.
    Пишу по памяти, не проверял, но что-то из этого точно подойдёт.
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    nidalee, Выше пишете всё совершенно верно, только не тому человеку ответили (цитируете не меня). :)
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    WbICHA,
    с каких пор установка фиксированного объёма файла подкачки является плохой идеей?
    Идея стала плохой в тот момент, когда в настройку полез ламер, возомнивший, что в механизмах распределения памяти он понимает больше чем сами разработчики ОС.
  • Вечная нехватка ОЗУ, но при достаточном ее наличии в win 10 | как это исправить?

    @kalapanga
    Кирилл Павлов,
    попробую 4 поставить
    Вот в этом и главная беда! Ничего устанавливать не надо. Только автоматически, по выбору операционной системы!
  • Какой набор нужен для начального измерителя температуры на Ardunio?

    @kalapanga
    fantazerno, Ну и конечно в хозяйстве нужно иметь принадлежности для пайки и хоть какой-то мультиметр. Иначе встанете в тупик при первом же "не заработало".
    В догонку. Если будете покупать ардуинки где-нибудь на алиэкспрессах/бангудах, не берите платы на которых написано WAVGAT. Они в формфакторе ардуино, но там другой микроконтроллер. Начинающему лучше с этим не заморачиваться.
  • Почему перегревается ноутбук?

    @kalapanga
    Да он видимо по жизни утюг. Интернет забит вопросами про перегрев у этой модели. Кто-то биос перепрошивает (вроде какое-то из обновлений и с перегревом боролось), кто-то решётки пилит, чистки и смазки всякие, вобщем кто во что горазд, но похоже, что без особых результатов в большинстве случаев
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Это да, в семёрке дженериков ещё не было. Сейчас же у них бесплатная версия - комьюнити эдишн есть. Для учебных целей самое оно!
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Отлично! Вот на всякий случай мой вариант: https://cloud.mail.ru/public/PioU/6Cxxwzsey
    Рекурсия из книжки, стек из вашего примера. Имена переменных особо не менял, сделал только их максимально похожими в обоих расчетах.
    По крайней мере для 10 оба расчета показывают как положено - 724. :)
    Может чего интересного для себя подглядите.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Попробуйте. На дельфевый стек там всё переписывается просто. Вместо самодельного стека в процедуре расчета будет
    procedure ...
    var
      Stack: TStack<integer>;
    begin
      Stack := TStack<integer>.Create;
      try
        //...
        // Тут весь расчёт
        // ...
      finally
        Stack.Free;
      end;
    end;

    Ну и где у него например push(Y); будет Stack.Push(Y); И соответственно pop; превратится в Stack.Pop;
    st_print у него печатает очередное решение, вместо этого будет ваша отрисовка доски.
    В ней достать значения из стека, чтобы их отобразить можно например в цикле через pop.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Ну тут надо почти весь Ваш алгоритм переписать. В этом примере решение действительно формируется в стеке. Но это потому, что для проверки позиции на доске оно не нужно, здесь используются три дополнительных массива, а не само решение. Так в книжке у Вирта эта задача решается, только там с рекурсией. Но определение можно поставить или нет именно такое.
    У Вас же для проверки того, можно или нет поставить ферзя используется сам массив который и будет решением. В этом случае стек как корове седло.
    Чтобы это задание красиво сделать, надо взять вашу оболочку с рисованием, рекурсивное решение из книжки Вирта и решение со стеком из консольного примера, в котором самодельный стек заменить на дельфёвый TStack.
    Справитесь?
  • Как переделать рекурсию под стек?

    @kalapanga
    Alertoso, обидно, что на самом деле такие бестолковые задания вам дают. Не хочется на них время тратить. Ну покажите, что Вы там нашли (выложите опять на диск какой). Если оно работает и там что-нибудь про стек есть...