Консультация № 183077
06.05.2011, 17:54
51.04 руб.
0 9 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Сапожников, Токарев, Музыкантов, Кузнецов
Их фамилии не соответствуют профессиям.
Фамилия сапожника не соответствует профессии Музыкантова
Фамилия токаря не Кузнецов и она не соответствует профессии Токарев
у кого какая профессия. Заранее спасибо)

Обсуждение

давно
Посетитель
7438
7205
06.05.2011, 17:56
общий
Это вопрос по Паскалю?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.05.2011, 17:59
общий
06.05.2011, 18:02
Да, решение задачи должно быть в паскале.
Там как-то начинается, типа
Сапожников - A
Токарев - В
... потом логически составляется выражение
Например: A and not(B)
в принципе, дискретная математика(логическая задача)!
давно
Профессор
230118
3054
06.05.2011, 20:08
общий
Нужно генерировать все подстановки - их 24. И для каждой проверять условие.
Неизвестный
07.05.2011, 17:12
общий
Прошу вас помочь :)
давно
Профессионал
304622
583
07.05.2011, 22:14
общий
А вы рекурсию проходили?
Неизвестный
07.05.2011, 22:42
общий
Проходили, но на теме не присутствовал
давно
Профессионал
304622
583
09.05.2011, 14:21
общий
(Извините, занят был.)

Есть решение через рекурсию. Если хотите, можно написать так.

Либо попробую перебрать все перестановки. Выбирайте.
Неизвестный
09.05.2011, 17:25
общий
09.05.2011, 17:31
хм, ну через циклы, и дополнительно переменную для ответа! (логические связи)
Сколько переменных, столько и циклов!
Хотелось бы написать простым вариантом!
давно
Профессионал
304622
583
09.05.2011, 21:37
общий
это ответ
Здравствуйте, JohnyWayne!

Вот что получилось. По моему довольно громоздко и уродливо -- мне дико не нравится. Но работает правильно. (Кстати, два решения)

Код:

const famlist:array[1..4] of string=('Сапожников',
'Токарев',
'Музыкантов',
'Кузнецов');

proflist:array[1..4] of string=('сапожник',
'токарь',
'музыкант',
'кузнец');

var fams:array[1..4] of integer; {Распределение фамилия по профессииям}
fam_busy:array[1..4] of boolean; {Занята ли фамилия}
i:1..4;

begin
{Очищаем массивы}
for i:=1 to 4 do
begin
fams[i]:=0;
fam_busy[i]:=false;
end;

{Перебираем фамилии сапожника, начиная с Токарев (Сапожников пропускаем)}
fams[1]:=2;
while fams[1]<= 4 do
begin
{Помечаем выбранную фамилию, как занятую}
fam_busy[fams[1]]:=true;
{Перебираем фамилии токаря}
fams[2]:=1;
while fams[2]<=4 do
begin
{Если выбранная фамилия не занята и не совпадает с профессией
и не Кузнецов}
if not fam_busy[fams[2]] and (fams[2]<>2) and (fams[2]<>4)
then begin
{Помечаем выбранную фамилию, как занятую}
fam_busy[fams[2]]:=true;
{Перебираем фамилии музыканта}
fams[3]:=1;
while fams[3]<= 4 do
begin
{Если выбранная фамилия не занята
и не совпадает с профессией}
if not fam_busy[fams[3]] and (fams[3]<>3) then
begin
{Помечаем выбранную фамилию, как занятую}
fam_busy[fams[3]]:=true;
{Перебираем фамилии кузнеца}
fams[4]:=1;
while fams[4]<=3 do
begin
{Если выбранная фамилия не занята}
if not fam_busy[fams[4]]
{фамилия сапожника не соответствует
профессии Музыкантова}
and (fams[fams[1]]<>3)
{фамилия токаря не соответствует
профессии Токарева}
and (fams[fams[2]]<>2)
then begin
{Выводим соответствия профессий и фамилий}
for i:=1 to 4 do writeln(proflist[i],' - ',famlist[fams[i]]);
writeln('---');
end;
{Следующая фамилия}
fams[4]:=fams[4]+1;
end;
{Освобождаем рассмотренную фамилию}
fam_busy[fams[3]]:=false;
end;
{Следующая фамилия}
fams[3]:=fams[3]+1
end;
{Освобождаем рассмотренную фамилию}
fam_busy[fams[2]]:=false;
end;
{Следующая фамилия}
fams[2]:=fams[2]+1;
end;
{Освобождаем рассмотренную фамилию}
fam_busy[fams[1]]:=false;
{Следующая фамилия}
fams[1]:=fams[1]+1;
end;
readln;
end.


5
Форма ответа