Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Авторешение головоломки

Автор: Nike0 29.09.2010 16:32

Доброго времени суток. Обращаюсь с таким вопросом: можете подкинуть какую-нибудь идею с авторешением головоломки Прикрепленное изображение. Смысл её заключается в том, чтобы расставить +,-,*,/ и = так чтобы получилось верное равенство, но при этом они могут использоваться 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 возможных вариантов рассматривалось бы...
вот никак не могу придумать, как это счасть е в небольшую часть кода впихнуть. Если кому-то интересно, вот автоответ smile.gif (т.е. в кнопку уже забито правильное положение символов)
Прикрепленное изображение

Автор: volvo 29.09.2010 17:45

Цитата
ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 120 возможных вариантов рассматривалось бы...
blink.gif Каких проверок? Это в 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;

begin
calc(1);
end.
Вот результат:

Running "f:\programs\pascal\test.exe"
7 + 12 / 24 = 6 - 6 * 4
7 * 12 - 24 / 6 = 6 + 4


, Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? smile.gif Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?

Автор: Nike0 29.09.2010 18:16

Цитата(volvo @ 29.09.2010 13:45) *

Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? smile.gif Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?

мм, спасибо) счас посидел поэтапно посмотрел как перебирает решения, но так и не понял какую строку нужно добавить для отсечения приблизительного решения

Автор: volvo 29.09.2010 20:00

Ну, например

вот так (Показать/Скрыть)
, как видишь, даже строку добавлять не пришлось, достаточно было только производить все вычисления с вещественными, а не с целыми числами...