| 
| 
 | Вопрос # 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 (статус: 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 (статус: 2-ой класс), 18 января 2010, 20:38 [#2]:да вообще не суть, мне нужно сгенерировать такую таблицу, а о выводе уже буду думать позже. Никак не могу придумать алгоритм почему-то. А если есть более быстрая альтернатива стринггриду, то предлагайте. Но вообще это не так важно, как сами комбинации... |  
|   | webkent (статус: 2-ой класс), 18 января 2010, 23:04 [#3]:Валя не работает ваш код почему-то у меня |  
|   | Валя (статус: 1-ый класс), 19 января 2010, 00:02 [#4]:webkent: действительно, забыл добавить переменную a: array [0..4] of byte;
 с ней должно работать
 |  
|   | 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 (статус: 2-ой класс), 19 января 2010, 10:32 [#7]:А так не правильно генерирует. Комбинации которые не подходят |  
|   | webkent (статус: 2-ой класс), 19 января 2010, 12:21 [#8]:Ошибся, всё работает, спасибо огромное, Вадим! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |