IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Авторешение головоломки, Delphi
Nike0
сообщение 29.09.2010 12:32
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Доброго времени суток. Обращаюсь с таким вопросом: можете подкинуть какую-нибудь идею с авторешением головоломки Прикрепленное изображение. Смысл её заключается в том, чтобы расставить +,-,*,/ и = так чтобы получилось верное равенство, но при этом они могут использоваться 1 раз, также если будет такое выражение 18-6*3, то сначало будет выполняться 18-6, а только потом умножаем на 3.
У меня были свои идеи по поводу решения этой задачи, но к сожалению они не эргономичны и глупы, можно сказать лбом пробивал решение)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 29.09.2010 13:45
Сообщение #2


Гость






Цитата
ну это очень долгая история вычисления была бы, но попробую: тот же перебор, но вручную и с огромным количеством проверок, т.е 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 14:16
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


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

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

мм, спасибо) счас посидел поэтапно посмотрел как перебирает решения, но так и не понял какую строку нужно добавить для отсечения приблизительного решения
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 14:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"