Доброго времени суток. Обращаюсь с таким вопросом: можете подкинуть какую-нибудь идею с авторешением головоломки Нажмите для просмотра прикрепленного файла. Смысл её заключается в том, чтобы расставить +,-,*,/ и = так чтобы получилось верное равенство, но при этом они могут использоваться 1 раз, также если будет такое выражение 18-6*3, то сначало будет выполняться 18-6, а только потом умножаем на 3. У меня были свои идеи по поводу решения этой задачи, но к сожалению они не эргономичны и глупы, можно сказать лбом пробивал решение)
TarasBer
29.09.2010 17:08
Перебор, какие сложности? Расставить 5 знаков в 5 клетках, всего 5!=120 вариантов. Тут интереснее, как заставить программу считывать значения из полей и самой заполнять пробелы.
Nike0
29.09.2010 17:13
Цитата(TarasBer @ 29.09.2010 13:08)
Перебор, какие сложности? Расставить 5 знаков в 5 клетках, всего 5!=120 вариантов. Тут интереснее, как заставить программу считывать значения из полей и самой заполнять пробелы.
про перебор я тоже думал, мне тоже очень интересно, как посчитать, запомнить и заполнить ячейки
volvo
29.09.2010 17:21
Цитата
меня были свои идеи по поводу решения этой задачи
А ты озвучь их, возможно, они не настолько глупы, как тебе кажется...
Nike0
29.09.2010 17:34
Цитата(volvo @ 29.09.2010 13:21)
А ты озвучь их, возможно, они не настолько глупы, как тебе кажется...
ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 120 возможных вариантов рассматривалось бы... вот никак не могу придумать, как это счасть е в небольшую часть кода впихнуть. Если кому-то интересно, вот автоответ (т.е. в кнопку уже забито правильное положение символов) Нажмите для просмотра прикрепленного файла
volvo
29.09.2010 17:45
Цитата
ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 120 возможных вариантов рассматривалось бы...
Каких проверок? Это в 50 строк все делается:
type oper = (plus, minus, mult, divv, eq);
const arr: array[1 .. 6] of integer = (7, 12, 24, 6, 6, 4); s_ops: array[oper] of char = ('+', '-', '*', '/', '='); var op: set of oper; ops: array[1 .. 5] of oper;
procedure calc(level: integer); var i: oper; j, left, curr: longint; begin if level = 6 then begin curr := arr[1]; for j := 1 to 5 do case ops[j] of plus: curr := curr + arr[j + 1]; minus: curr := curr - arr[j + 1]; mult: curr := curr * arr[j + 1]; divv: curr := curr div arr[j + 1]; eq: begin left := curr; curr := arr[j + 1]; end; end;
if left = curr then begin for j := 1 to 5 do write(arr[j], ' ', s_ops[ops[j]], ' '); writeln(arr[6]); end; end else for i := plus to eq do begin if not (i in op) then begin include(op, i); ops[level] := i; calc(level + 1); exclude(op, i); end; end; end;
, Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?
Nike0
29.09.2010 18:16
Цитата(volvo @ 29.09.2010 13:45)
Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?
мм, спасибо) счас посидел поэтапно посмотрел как перебирает решения, но так и не понял какую строку нужно добавить для отсечения приблизительного решения
volvo
29.09.2010 20:00
Ну, например
вот так(Показать/Скрыть)
procedure calc(level: integer); const eps = 0.00001; var i: oper; j: longint; left, curr: double; begin if level = 6 then begin curr := arr[1]; for j := 1 to 5 do case ops[j] of plus: curr := curr + arr[j + 1]; minus: curr := curr - arr[j + 1]; mult: curr := curr * arr[j + 1]; divv: curr := curr / arr[j + 1]; eq: begin left := curr; curr := arr[j + 1]; end; end;
if abs(left - curr) < eps then begin for j := 1 to 5 do write(arr[j], ' ', s_ops[ops[j]], ' '); writeln(arr[6]); end; end else for i := plus to eq do begin if not (i in op) then begin include(op, i); ops[level] := i; calc(level + 1); exclude(op, i); end; end; end;
, как видишь, даже строку добавлять не пришлось, достаточно было только производить все вычисления с вещественными, а не с целыми числами...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.