Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2017, 19:06   #1
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию Pascal. Перемещение по графику.

Имеется олимпиадная задача:
График. Робот. Начальная позиция робота на графике - 0 0. Перемещаться он может во все стороны света на 1 за ход (Север, Юг, Запад, Восток). На вход поступает число от 0 до 16, показывающее количество ходов, и координаты конечной точки. Написать программу, вычисляющую сколько возможных путей может быть у робота из точки 0 0 до места назначения, с использованием заданного количества ходов. Ни больше, ни меньше. Пример: Input - 3 1 0
Output - 9
Код напишу сам, помогите с алгоритмом. Заранее спасибо.
nobody_nohead вне форума Ответить с цитированием
Старый 17.01.2017, 22:20   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Поскольку максимальное количество ходов ограничено 16, то проще всего рекурсивно в глубину перебрать все возможные пути. Кода получилось всего строчек 10.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.01.2017 в 22:35.
BDA на форуме Ответить с цитированием
Старый 19.01.2017, 14:44   #3
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
проще всего рекурсивно в глубину перебрать все возможные пути
Чего - то я очень туплю, не подскажите как реализовать этот перебор? Вот что у меня получилось:
Код:
program olymp3;

var x, y, dif, n, i: integer;
    ans: longint;

begin
{Init data}
writeln('Input n, x, y: ');
read(n); read(x); read(y); 

{Solution}
if n < (x + y) then {Not enough turns to reach}
begin
	ans:= 0;
end
else if n = (x + y) then {Equal}
begin
	if x = 0 or y = 0 then
	begin
		ans:= 1;
	end
	else
	begin
		ans:= 2;
	end;
end
else {Counting}
begin
	dif:= n - (x + y);
	if (dif mod 2) = 1 then
	begin
		ans:= 0;
	end
	else
	begin
		{}
	end;	
	

end;

{Answer}
writeln(ans);
readln;
end.
nobody_nohead вне форума Ответить с цитированием
Старый 19.01.2017, 15:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте так:
Код:
function Count(n, x, y, xk, yk : integer) : integer;
var Res : integer;
begin
  if n=0 then begin
    if (x=xk) and (y=yk) then Count := 1
    else Count := 0;
    Exit
  end;
  Count := Count(n-1, x+1, y, xk,yk) +
     Count(n-1, x-1, y, xk,yk) +
     Count(n-1, x, y+1, xk,yk) +
     Count(n-1, x, y-1, xk,yk);
end;

var n,x,y : integer;
begin
  n := 3;
  x := 1;
  y := 0;
  WriteLn('для n=',n,' и координат назначения ',x,y,
     ' существует ',Count(n,0,0,x,y),' способов')
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.01.2017, 18:05   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

К ответу Serge_Bliznykov добавлю, что вы верно добавили проверку на количество необходимых шагов. Без этой проверки код ниже выполнялся примерно 13 секунд на случае 16 шагов, и 2 секунды - с проверкой:
Код:
function solve(step, x1, y1, x2, y2: integer): integer;
begin
  if step < abs(x1 - x2) + abs(y1 - y2) then
    result := 0
  else if step = 0 then
    result := ord((x1 = x2) and (y1 = y2))
  else
    result := solve(step - 1, x1, y1, x2 + 1, y2) + solve(step - 1, x1, y1, x2 - 1, y2) +
        solve(step - 1, x1, y1, x2, y2 + 1) + solve(step - 1, x1, y1, x2, y2 - 1);
end;
...
// вызов solve(step, x1, y1, 0, 0)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.01.2017 в 18:08.
BDA на форуме Ответить с цитированием
Старый 19.01.2017, 18:06   #6
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте так:
Спасибо, работает.
nobody_nohead вне форума Ответить с цитированием
Старый 19.01.2017, 18:19   #7
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Всем большое спасибо. Все оказалось куда тривиальнее, чем я думал.
nobody_nohead вне форума Ответить с цитированием
Старый 20.01.2017, 00:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
К ответу Serge_Bliznykov добавлю, что вы верно добавили проверку на количество необходимых шагов.
да, полностью согласен!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение по матрице( Free Pascal) Nastya1221 Помощь студентам 0 04.07.2012 18:08
Перемещение запятой (Pascal) Черепаwка Помощь студентам 1 14.05.2011 15:21
Массивы и построение таблицы значений х,у по графику (Turbo Pascal) JIUMOH Помощь студентам 6 21.12.2009 20:30