289 / 34 / 6
Регистрация: 20.09.2011
Сообщений: 464
1

Ребус

05.12.2012, 22:49. Показов 1798. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан ребус: ABC+DEF=XYZ (все цифры - разные). Задача состоит в том, чтобы найти всевозможные комбинации чисел, которые будут являться решением данного ребуса.
Набросал следующий код:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const
  f=1;
 
var
  q: set of 0..9;
  l, o, b, t, r, i, s, a, m: longint;
 
begin
  for l:=f to 9 do
    begin
      include(q,l);
      for o:=0 to 9 do
        begin
          if not (o in q) then
            begin
              include(q,o);
              for b:=0 to 9 do
                begin
                  if not (b in q) then
                    begin
                      include(q,b);
                      for t:=f to 9 do
                        begin
                          if not (t in q) then
                            begin
                              include(q,t);
                              for r:=0 to 9 do
                                begin
                                  if not (r in q) then
                                    begin
                                      include(q,r);
                                      for i:=0 to 9 do
                                        begin
                                          if not (i in q) then
                                            begin
                                              include(q,i);
                                              for s:=0 to 9 do
                                                begin
                                                  if not (s in q) then
                                                    begin
                                                      include(q,s);
                                                      for a:=0 to 9 do
                                                        begin
                                                          if not (a in q) then
                                                            begin
                                                              include(q,a);
                                                              for m:=0 to 9 do
                                                                begin
                                                                  if not (m in q) then
                                                                    begin
                                                                      include(q,m);
                                                                      if (l+t)*100+(o+r)*10+b+i=s*100+a*10+m then
                                                                        begin
                                                                          writeln(l,o,b,' + ',t,r,i,' = ',s,a,m);
                                                                        end;
                                                                      exclude(q,m);
                                                                    end;
                                                                end;
                                                              exclude(q,a);
                                                            end;
                                                        end;
                                                      exclude(q,s);
                                                    end;
                                                end;
                                              exclude(q,i);
                                            end;
                                        end;
                                      exclude(q,r);
                                    end;
                                end;
                              exclude(q,t);
                            end;
                        end;
                      exclude(q,b);
                    end;
                end;
              exclude(q,o);
            end;
        end;
      exclude(q,l);
    end;
  readln;
end.

Результаты выдает правильные, но их ОЧЕНЬ МНОГО. Начал разбираться, оказалось что в программе некоторые значения дубоируются, например выводятся значения 847+106=953 и 106+857=953. Может и еще что-то лишнее выводится, однако я пока этого не заметил.
Помогите оптимизировать данный код.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2012, 22:49
Ответы с готовыми решениями:

Ребус
Помогите решить ребус) ДВА*ТРИ=ШЕСТЬ под буквами зашифрованы слова. Я уже решила его расписывая...

Решить ребус M^3=КУБ
Решить ребус M^3=КУБ

Комбинаторные алгоритмы (Числовой ребус)
Между цифрами 1,2,...,9 вставьте знаки +,-*,/ так, чтобы результат был равен числу А. Найдите все...

Решите ребус: сорок*5=двести
Решите ребус : СОРОК*5=ДВЕСТИ

1
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
06.12.2012, 07:32 2
Вот, можно вот такой рекурсивной функцией. Только пришлось вставить увеличение размера экранного буфера консоли, иначе можно было посмотреть только 256 последних результатов.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
 
Var
 f : _COORD;
 a : Array[1..9] Of Integer;
 ss : Set Of 0..9 = [];
 
procedure Prs(k:Byte);
var
  i : Byte;
  arg1,arg2 : Integer;
begin
  for i:=0 to 9 do
  If Not (i In ss) Then
  begin
    a[k]:=i;
    Include(ss,i);
    if k<9 then
    Prs(k+1) else
    Begin
      arg1:=(a[1]*100)+(a[2]*10)+a[3];
      arg2:=(a[4]*100)+(a[5]*10)+a[6];
      If arg1<arg2 Then
      if (arg1+arg2-(a[7]*100)-(a[8]*10)-a[9])=0 then
      writeln(a[1],a[2],a[3],' + ',a[4],a[5],a[6],' = ',a[7],a[8],a[9]);
    End;
    Exclude(ss,i);
  end;
end;
 
begin
  f.X:=80;
  f.Y:=1000;
  //Увеличение количества строк в консоли
  SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),f);
 
  Prs(1);
 
  ReadLn;
end.
А для отсечения таких варианто, как ты описал: строка 28.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2012, 07:32
Помогаю со студенческими работами здесь

Вместо каждой буквы в ребус (ЛИК)2=БУБЛИК под¬ставить некоторую цифру
Вместо каждой буквы в ребус (ЛИК)2=БУБЛИК под¬ставить некоторую цифру, причем одинаковым буквам...

Ребус: "Факт + Факт = Наука"
Ребят помогите плз, нужно заменить букви цифрами так, что б уравнение ФАКТ+ФАКТ=НАУКА стала верной....

ребус
ОЧЕНЬ СРОЧНО!!! Пожалуйста! Решить ребус при условии, что разным буквам соответствуют разные цифры ...

Ребус
Плиз ребят помогите ребус , ДВА+ТРИ=ПЯТЬ(без масивов на уровне 9 класса)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru