Доброго времени суток. Обращаюсь с таким вопросом: можете подкинуть какую-нибудь идею с авторешением головоломки Нажмите для просмотра прикрепленного файла. Смысл её заключается в том, чтобы расставить +,-,*,/ и = так чтобы получилось верное равенство, но при этом они могут использоваться 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: setof oper;
ops: array[1 .. 5] of oper;
procedure calc(level: integer);
var
i: oper;
j, left, curr: longint;
beginif level = 6thenbegin
curr := arr[1];
for j := 1to5docase 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 thenbeginfor j := 1to5do
write(arr[j], ' ', s_ops[ops[j]], ' ');
writeln(arr[6]);
end;
endelsefor i := plus to eq dobeginifnot (i in op) thenbegin
include(op, i);
ops[level] := i;
calc(level + 1);
exclude(op, i);
end;
end;
end;
begin
calc(1);
end.
, Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?
Nike0
29.09.2010 18:16
Цитата(volvo @ 29.09.2010 13:45)
Первый вариант - приблизительный, второй - точный. Отсечь приблизительный - еще одна строка. Какие проверки? Вся твоя задача - в том, чтобы считать исходные данные (числа каждой строки) в массив arr. Хочешь, прогоню программу со второй строкой?
мм, спасибо) счас посидел поэтапно посмотрел как перебирает решения, но так и не понял какую строку нужно добавить для отсечения приблизительного решения