Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 665

/ вопрос открыт /

Здравствуйте!
Помогите пожалуйста составить алгоритм заполнения StringGrid с пятью столбцами всевозможными комбинациями чисел, которые в сумме будут равны 10.

Допустим
10-0-0-0-0
0-10-0-0-0
...............
0-0-0-0-10
9-1-0-0-0
9-0-1-0-0

и т.д.
Пожалуйста, очень нужно!

webkent Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: webkent (статус: 2-ой класс)
Вопрос отправлен: 18 января 2010, 19:39
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Валя

Здравствуйте, webkent! Возможно этот код вам поможет.

procedure TForm1.FormCreate(Sender: TObject);
var i,j,k: integer; f: boolean;
begin
 stringgrid1.colcount:=5;
 stringgrid1.rowcount:=1;
 f:=false;
 i:=0;
 a[i]:=0;
 repeat
   if a[i]=10 then
     if i<4 then begin
       a[i]:=0;
       inc(i);
       end
       else begin
       f:=true;
       end
     else begin
     inc(a[i]);
     i:=0;
       if not f then
       if (a[0]+a[1]+a[2]+a[3]+a[4])=10 then begin
         stringgrid1.rowcount:=stringgrid1.rowcount+1;
         for j:=0 to 4 do
           stringgrid1.Cells[j,stringgrid1.RowCount-2]:=inttostr(a[j]);
         end;
     end;
     until f;
end;

Ответ отправил: Валя (статус: 1-ый класс)
Время отправки: 18 января 2010, 22:03
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, webkent!
А как вот такой код

procedure TForm1.FormCreate(Sender: TObject);
var i,j,k: integer;
    a1, a2, a3, a4, a5, t:byte;
begin
  for a1 := 0 to 10 do
  for a2 := 0 to 10 do
  for a3 := 0 to 10 do
  for a4 := 0 to 10 do
  begin
    t := a1+a2+a3+a4;
    if (t > 10) then //плохо, уже больше
      continue;
    a5 := 10 - t;
    with stringgrid1 do begin
      RowCount:=RowCount+1;
      cells[0,rowcount-2]:=inttostr(a1);
      cells[1,rowcount-2]:=inttostr(a2);
      cells[2,rowcount-2]:=inttostr(a3);
      cells[3,rowcount-2]:=inttostr(a4);
      cells[4,rowcount-2]:=inttostr(a5);
    end;
  end;
end;

код можно ещё ускорить, если вставить дополнительные проверки, например после второго for что то вида
begin
if (a1 + a2 > 10) continue;

А ещё эту задачу можно решать с помощью рекурсии:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 января 2010, 11:39
Оценка за ответ: 5

Комментарий к оценке: Спасибо что помогаете, сам сидел ломал голову!

Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 19 января 2010, 12:21; участников в обсуждении: 3.
Жикльор

Жикльор (статус: 5-ый класс), 18 января 2010, 20:30 [#1]:

А почему СтринжГрид? Если такое количество комбинаций заносить в СтринжГрид, то это небыстроспособно для компьютера.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
webkent

webkent (статус: 2-ой класс), 18 января 2010, 20:38 [#2]:

да вообще не суть, мне нужно сгенерировать такую таблицу, а о выводе уже буду думать позже. Никак не могу придумать алгоритм почему-то. А если есть более быстрая альтернатива стринггриду, то предлагайте. Но вообще это не так важно, как сами комбинации...
webkent

webkent (статус: 2-ой класс), 18 января 2010, 23:04 [#3]:

Валя не работает ваш код почему-то у меня
Валя

Валя (статус: 1-ый класс), 19 января 2010, 00:02 [#4]:

webkent: действительно, забыл добавить переменную
a: array [0..4] of byte;
с ней должно работать
webkent

webkent (статус: 2-ой класс), 19 января 2010, 00:13 [#5]:

я добавил всёравно что-то не пашет. Если у тебя работает плиз скинь проект
Валя

Валя (статус: 1-ый класс), 19 января 2010, 08:39 [#6]:

очень странно. ругается на что нибудь?
интересный случай... попробуем зайти с другой стороны
а вот этот код будет работать?
procedure TForm1.FormCreate(Sender: TObject);
var i,j,k: integer;
    a: array [0..4] of byte;
begin
  for i:=0 to 161051 do begin
    k:=1;
    for j:=0 to 4 do begin
      a[j]:=(i div k) mod 11;
      k:=k*11;
      end;
    if (a[0]+a[1]+a[2]+a[3]+a[4])=10 then
      with stringgrid1 do begin
        RowCount:=rowcount+1;
        for j:=0 to 4 do
          cells[j,rowcount-2]:=inttostr(a[j]);
        end;
    end;
end;
webkent

webkent (статус: 2-ой класс), 19 января 2010, 10:32 [#7]:

А так не правильно генерирует. Комбинации которые не подходят
webkent

webkent (статус: 2-ой класс), 19 января 2010, 12:21 [#8]:

Ошибся, всё работает, спасибо огромное, Вадим!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:02
Выполнено за 0.04 сек.