Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/68: Рейтинг темы: голосов - 68, средняя оценка - 4.78
5 / 5 / 3
Регистрация: 07.11.2011
Сообщений: 21
1

Исполнитель водолей

16.12.2011, 04:22. Показов 13239. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть "Сишный"(С++) код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const int LIMIT = 1e5 + 10;
  int a, b, n;
  cin >> a >> b >> n;
  char min = 'A', max = 'B';
  bool real = false;
  if (b < a)
  {
    swap(a, b);
    swap(min, max);
  }
  int bV = 0, aV = 0;
 
  int k = 0;
  do
  {
    k++; /*printf(">%c\n",min);*/       
    k++; /*printf("%c>%c\n", min, max);*/   
    if (b - bV >= a)
      bV += a;
    else
    {
      bV = a - (b - bV);
      k++; /*printf("%c>\n",max);*/    
      k++; /*printf("%c>%c\n", min, max);*/ 
    }
    if (n == bV)
    {
      real = true;
      break;
    }
  }
  while(k <= LIMIT);
 
  if (real)
  {
    bV = 0;
    do
    {
      printf(">%c\n",min);       
      printf("%c>%c\n", min, max);   
      if (b - bV >= a)
        bV += a;
      else
      {
        bV = a - (b - bV);
        printf("%c>\n",max);     
        printf("%c>%c\n", min, max); 
      }
      if (n == bV)
        break;
    }
    while(true);
  }
  else
    cout<<"Impossible";
Это алгоритм решения задачи "Исполнитель водолей", его нужно перевести в Pascal, синтаксис паскаля я знаю на уровне школия 10 класса, вообщем я не знаю как заменить do - while в паскале, я думаю что тут замешан цикл repeat, но я не понимаю как пользоваться этим циклом. прошу вашей помощи ;) а вообще, я честно говоря смутно понимаю принцип работы этого алгоритма, поэтому то и возникли трудности с переводом.

Кстати вот и сама задача:
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также кран с водой. Водолей может выполнять следующие операции:
Наполнить сосуд A (обозначается >A).
Наполнить сосуд B (обозначается >B).
Вылить воду из сосуда A (обозначается A>).
Вылить воду из сосуда B (обозначается B>).
Перелить воду из сосуда A в сосуд B (обозначается как A>B).
Перелить воду из сосуда B в сосуд A (обозначается как B>A).
Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью опустошается, либо второй сосуд полностью наполняется.
Программа получает на вход три натуральных числа A, B, N, не превосходящих 104 Вам необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible. Количество операций в алгоритме не должно превышать 105. Гарантируется, что если задача имеет решение, то есть решение, которое содержит не более, чем 105 операций.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2011, 04:22
Ответы с готовыми решениями:

Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также...

Исполнитель Водолей
Нужен легкий код. На форуме уже видел решение, но большую его часть я не понял. У...

Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также...

Задача "Исполнитель Водолей"
Никак не могу додуматься до решения задачи( :wall: Исполнитель Водолей У исполнителя...

6
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
16.12.2011, 09:28 2
Даже условие переписать нормально лень. Там же не 104, 105, а 10^4, 10^5

Добавлено через 1 минуту
И вообще, зачем тебе олимпиадные задачи, если даже азы ни Паскаля ни С++ не знаешь?
0
5 / 5 / 3
Регистрация: 07.11.2011
Сообщений: 21
16.12.2011, 10:29  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
Даже условие переписать нормально лень. Там же не 104, 105, а 10^4, 10^5

Добавлено через 1 минуту
И вообще, зачем тебе олимпиадные задачи, если даже азы ни Паскаля ни С++ не знаешь?
Хм, это не олимпиадная задача, это одна из задач которую нам подкинул методист из лицея.
"Азов С++" я действительно не знаю, так как мы изучаем именно Pascal, тему "Циклы while", а задача я так понимаю на использование циклов с постусловием, так как я не понял как решать данную задачу, я немного "погуглил" и нашел решение на С++ в котором не могу разобраться.

Условие действительно не точно, вы правы.
0
приходько
15.11.2012, 20:58 4
Всё очевидно.
1) С++ позволяет создавать переменные прямо по ходу программы (поэтому отсутствует раздел объявления и инициализации переменных).
2)
do
{...}
while (condition)

означает

while (condition) do
begin
...
end;

Код вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
const
  LIMIT=100000;
var
  a,b,n:longint;
  min,max:char;
  reall:boolean;
  bV,aV,k:longint;
begin
read(a,b,n);
min:='A';
max:='B';
reall:=false;
if a>b then
  begin
  min:='B';
  max:='A';
  a:=a+b;
  b:=a-b;
  a:=a-b;
  end;
aV:=0;
bV:=0;
k:=0;
while k<=LIMIT do
  begin
  inc(k,2);
  if (b - bV >= a)
   then inc(bV,a)
   else
    begin
    bV:= a - (b - bV);
    inc(k,2);
    end;
  if (n = bV) then
    begin
    reall := true;
    break;
    end;
  end;
if reall then
  begin
  bV:=0;
  while true do
    begin
    writeln('>',min);
    writeln(min,'>',max);
    if b-bV>=a then inc(bV,a)
    else
      begin
      bV := a-(b - bV);
      writeln(max,'>');
      writeln(min,'>',max);
      end;
      if (n = bV) then break;
    end;
  end
 else
  writeln('Impossible');
end.
На informatics.mccme.ru проходит все 98 тестов. Кстати, вы её не оттуда взяли?
И спасибо за С++ код. Второй день маялся, 49, 50, 52,56 тестов... а так - за полчаса сдал.
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
15.11.2012, 21:17 5
Цитата Сообщение от приходько Посмотреть сообщение
do
{...}
while (condition)
означает
while (condition) do
begin
...
end;
Ну и неверно.
C++
1
2
3
4
5
do
{
  /*...*/
}
while(condition);
Означает
Pascal
1
2
3
repeat
  {...}
until not condition;
0
приходько
16.11.2012, 20:16 6
Ты циклы давно проходил?
while - цикл с опережающим условием, выполняется пока оно истино.
repeat - цикл со следующим условием, выполняется до тех пор как оно станет истинным (пока оно ложно).
Единственное различие - repeat выполняется один раз в любом случае, но так как моя задача прошла все тесты, это может означать следующее:
а) Лишний пробег цикла здесь роли не играет;
или
б) Я прав.
Это к вопросу о том, что кто-то "не понимает как пользоваться этим циклом", но уже набрался храбрости перечить. Я оставил ответ в теме задачи "Водолей" на первой всплывающей вкладке для тех, кто как я с ней работал, но не смог самую малость.
Пользователь получил красную карточку за это сообщение.
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.11.2012, 20:27 7
Цитата Сообщение от приходько Посмотреть сообщение
Ты циклы давно проходил, умник?
Во-первых, будьте повежливее.
Цитата Сообщение от приходько Посмотреть сообщение
while - цикл с опережающим условием, выполняется пока оно истино.
Во-вторых, посмотрите на предмет обсуждения.
Цитата Сообщение от HighPredator Посмотреть сообщение
do
{
* /*...*/
}
while(condition);
Где здесь ваше "опережающее" условие, а? Ничего, что это цикл с постусловием? И ваше утверждение, что
Цитата Сообщение от приходько Посмотреть сообщение
do
{...}
while (condition)
означает
while (condition) do
begin
...
end;
неверно, хотя бы потому, что цикл с постусловием неэквивалентен циклу с предусловием.
0
16.11.2012, 20:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2012, 20:27
Помогаю со студенческими работами здесь

Задача "Исполнитель Водолей"
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также...

Подскажите алгоритм. Задача "Водолей"
Задача Водолей. Даны три емкости А, В, С, содержащие разный объем жидкости. Необходимо получить...

Исполнитель Робот
дали вот несколько задач (попросили решить, будучи студентом уже не ничего помню из курса...

Исполнитель и альбомы
Всем привет. Подскажите пожалуйста, напишите свои идеи. сам пока не могу додуматься как быть. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru