Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите решить задачу с монетками
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zeratull
Помогите решить задачу:

12 монет. Известен способ, как за три взвешивания на весах без гирь среди 12 монет найти фальшивую (отличающуюся от остальных по весу в неизвестную сторону). Для этого при каждом взвешивании на чаши весов нужно класть по 4 монеты. Реализовать такую идентификацию: человек загадывает номер фальшивой монеты и ее особенность (легче или тяжелее других). ЭВМ организует взвешивание, спрашивает, куда отклонилась стрелка весов при каждом опыте, и находит номер фальшивой монеты
volvo
Ну, так ты же знаешь алгоритм... Проблема с реализацией?
Насколько я понимаю, тройной If ... Then ... Else - вот и вся программа...

Что именно проблематично?
Zeratull
Как раз с реализацией проблемы.

У меня она что-то слишком громоздкой получается.
Переменных много.

Можете подсказать фрагмент основного кода реализации.
А остальное надеюсь допишу.
volvo
Цитата
У меня она что-то слишком громоздкой получается.
Вот и приведи то, что у тебя получается...
klem4
А что является одним испытанием, когда замер происходит в момент нахождения монет и на правой чаше и на левой ?
Lapp
Цитата(klem4 @ 26.02.2006 21:04) *

А что является одним испытанием, когда замер происходит в момент нахождения монет и на правой чаше и на левой ?

Примерно так:

Входные данные (показываются программой на мониторе, три раза за игру):
- На левой чашке: монеты 1, 2, 5, 12
- На правой: 3, 4, 8, 10
(циферки я написал от балды)

Возможные варианты ответов (игрок отвечает, исходя из того, что он задумал: номер фальшивой монеты и тяжелее она или легче) :
- левая тяжелее
- левая легче
- одинаково

Алгоритм (который автор любезно опустил) весьма непростой. Прежде всего надо определиться с ним. Возможно также, что существует не один алгоритм. Поскольку задача размещена не в Математике, а в Задачах (на Паскале!), то нужно попросить автора темы выложить тут подробное описание алгоритма. И уже по нему делать прогу.. Верно?
volvo
lapp, ты меня извини, но не надо раздувать из мухи слона!
Цитата
Алгоритм (который автор любезно опустил) весьма непростой
Уж куда там... 3 строчки - это уникальный просто по сложности алгоритм... dry.gif

И,
Цитата
Поскольку задача размещена не в Математике, а в Задачах (на Паскале!)
, все дальнейшие рассуждения по поводу сложности алгоритма будут считаться флудом. Я тебя уже предупреждал, кажется? Есть, что сказать по теме - Yor Are Welcome, иначе, извини, I'll have to pull rank!
Lapp
Цитата(volvo @ 28.02.2006 15:24) *

lapp, ты меня извини, но не надо раздувать из мухи слона!
Уж куда там... 3 строчки - это уникальный просто по сложности алгоритм... dry.gif

Volvo, ты прав, сложность алгритма тут абсолютно ни при чем.
Да и сам алгоритм тут тоже абсолютно ни при чем.
По некотором размышлении набросал программу-рыбу.
Строчки заполнить нужной информацией..
Конечно, она не оптимальная.. строки зря тратит..
Некоторые комбинации, видимо, не осуществляются (27 строк на 24 ответа).

uses
CRT;

const
cL='l';
cE='e';
cR='r';

type
tAnswer = (N,L,E,R);

var
i:integer;
c:char;
S:array[1..3,L..R,L..R]of string;
F:array[L..R,L..R,L..R]of string;

const
A:array[1..3]of tAnswer=(N,N,N);

begin
S[1,N,N]:='Left: , Right: . What is heavier?';
S[2,L,N]:='Left: , Right: . What is heavier?';
S[2,E,N]:='Left: , Right: . What is heavier?';
S[2,R,N]:='Left: , Right: . What is heavier?';
S[3,L,L]:='Left: , Right: . What is heavier?';
S[3,L,E]:='Left: , Right: . What is heavier?';
S[3,L,R]:='Left: , Right: . What is heavier?';
S[3,E,L]:='Left: , Right: . What is heavier?';
S[3,E,E]:='Left: , Right: . What is heavier?';
S[3,E,R]:='Left: , Right: . What is heavier?';
S[3,R,L]:='Left: , Right: . What is heavier?';
S[3,R,E]:='Left: , Right: . What is heavier?';
S[3,R,R]:='Left: , Right: . What is heavier?';
F[L,L,L]:='False coin is #.. It is ..';
F[L,L,E]:='False coin is #.. It is ..';
F[L,L,R]:='False coin is #.. It is ..';
F[L,E,L]:='False coin is #.. It is ..';
F[L,E,E]:='False coin is #.. It is ..';
F[L,E,R]:='False coin is #.. It is ..';
F[L,R,L]:='False coin is #.. It is ..';
F[L,R,E]:='False coin is #.. It is ..';
F[L,R,R]:='False coin is #.. It is ..';
F[E,L,L]:='False coin is #.. It is ..';
F[E,L,E]:='False coin is #.. It is ..';
F[E,L,R]:='False coin is #.. It is ..';
F[E,E,L]:='False coin is #.. It is ..';
F[E,E,E]:='False coin is #.. It is ..';
F[E,E,R]:='False coin is #.. It is ..';
F[E,R,L]:='False coin is #.. It is ..';
F[E,R,E]:='False coin is #.. It is ..';
F[E,R,R]:='False coin is #.. It is ..';
F[R,L,L]:='False coin is #.. It is ..';
F[R,L,E]:='False coin is #.. It is ..';
F[R,L,R]:='False coin is #.. It is ..';
F[R,E,L]:='False coin is #.. It is ..';
F[R,E,E]:='False coin is #.. It is ..';
F[R,E,R]:='False coin is #.. It is ..';
F[R,R,L]:='False coin is #.. It is ..';
F[R,R,E]:='False coin is #.. It is ..';
F[R,R,R]:='False coin is #.. It is ..';
for i:=1 to 3 do begin
WriteLn(S[i,A[1],A[2]]);
repeat
c:=ReadKey;
case c of
cL:A[i]:=L;
cE:A[i]:=E;
cR:A[i]:=R;
end;
until A[i] in [L,E,R];
end;
WriteLn(F[A[1],A[2],A[3]])
end.

Zeratull
lapp
огромное спасибо. попробую разобраться с прогой.

На одном форуме видел предлагали такое теоретическое решение задачи:
Ссылка: http://diesel.elcat.kg/index.php?showtopic=181464#

Решение в 3 взвешивания ! ! !

Положение чаш весов будут показаны как = , > или <
---------------------------------------------
1. --- Если (1,2,3,4) = (5,6,7,8) то 1,,,8,9,10,11,12
2. --- (9) = (10) то 9,10,11,12,
3. --- (11) = (9) то 11,12
---
3. --- (11) <> (9) то 12,11
-------------------
9,10,11,12
2. --- (9) <> (10) то 11,12,9,10
3. --- (11) = (9) то 9,10
---
3. --- (11) <> (9) то 109
--------------------------------------------
1. --- (1,2,3,4) > (5,6,7,8) то 9,,,12,1,,,8
2. --- (1,2,5) = (3,4,9) то 1,,,5,6,7,8
3. --- (6) = (7) то 6,7,8
---
3. --- (6) > (7) то 6
---
3. --- (6) < (7) то 7
------------------
2. --- (1,2,5) > (3,4,9) то 1,2
3. --- (1) = (9) то 2
---
3. --- (1) <> (9) то 1
-----------------
2. --- (1,2,5) < (3,4,9) то 3,4,5 так как чаши весов теперь склонились в другую сторону, нежели при 1-м взвешивании.
3. --- (3,5) = (9,10) то 4
---
3. --- (3,5) > (9,10) то 3 по результату предыдущего взвешивания
---
3. --- (3,5) < (9,10) то 5
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.