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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2008, 02:24   #1
brainstorm
Новичок
Джуниор
 
Регистрация: 07.10.2008
Сообщений: 2
По умолчанию объясните, пожалуйста

пожалуйста, объясните чайнику как решать задачи такого типа:

Фишка может двигаться по полю длины N только вперед. Длина хода фишки не более K. Найти число различных путей, по которым фишка может пройти поле от начала до конца.

взято с Алголист.ру, даже если там и есть объяснение, я все равно не могу написать код
brainstorm вне форума Ответить с цитированием
Старый 13.10.2008, 09:28   #2
Shadow_Wind
Пользователь
 
Аватар для Shadow_Wind
 
Регистрация: 10.10.2008
Сообщений: 30
По умолчанию

var
N, K,P: integer;
begin
writeln('Введите длину пути');
readln(N);
writeln('Введите длину хода фишки');
readln(K);
P:=N/K;
writeln('Число путей равно ',P);
readln();

Это код Паскаля.
Shadow_Wind вне форума Ответить с цитированием
Старый 13.10.2008, 10:25   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Думается, не все так просто. Дело в том, что N может не делиться без остатка на К... Это - раз.
Второе - ходы могут и должны быть различной длины.
Задача, насколько я понимаю, состоит именно в том, чтобы найти все сочетания ходов с учетом наложенных ограничений по длине хода и общей длине пути.
mihali4 вне форума Ответить с цитированием
Старый 13.10.2008, 10:43   #4
Shadow_Wind
Пользователь
 
Аватар для Shadow_Wind
 
Регистрация: 10.10.2008
Сообщений: 30
По умолчанию

Какие могут быть сочетания ходов, если движение только вперёд? Т.е. задача выполняется один раз с известными переменными. Число найдено, другое дело, если были бы заданы другие условия задачи.
Shadow_Wind вне форума Ответить с цитированием
Старый 13.10.2008, 10:59   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Какие могут быть сочетания ходов, если движение только вперёд
Пусть общая длина пути - 11, ход не более 3.
Вариант 1: 3,3,3,2
Вариант 2: 1,1,1,1,1,1,1,1,1,1,1
Вариант 3: 2,3,2,3,1
и так далее...
Дальше объяснять? Или дошло?
mihali4 вне форума Ответить с цитированием
Старый 13.10.2008, 13:01   #6
Shadow_Wind
Пользователь
 
Аватар для Shadow_Wind
 
Регистрация: 10.10.2008
Сообщений: 30
По умолчанию

Всем извинения приношу! Упустил в задаче НЕ БОЛЕЕ ))
Shadow_Wind вне форума Ответить с цитированием
Старый 13.10.2008, 13:35   #7
Shadow_Wind
Пользователь
 
Аватар для Shadow_Wind
 
Регистрация: 10.10.2008
Сообщений: 30
По умолчанию

Теперь труднее... Может массив создать и в нём подсчёт вести?
Shadow_Wind вне форума Ответить с цитированием
Старый 13.10.2008, 14:28   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Делаете процедурку вычисления очередной комбинации ходов и поехали...
Берете первую комбинацию и проверяете сумму ходов на равенство суммарному пути. Равно - в правильные результаты, не равно - вычисляете следующую комбинацию.
Примерно так:
1 1 1 1 1 1 1 1 1 1 1 подходит
1 1 1 1 1 1 1 1 1 1 2 не подходит
1 1 1 1 1 1 1 1 1 2 подходит
1 1 1 1 1 1 1 1 2 1 подходит
1 1 1 1 1 1 1 2 1 1 подходит
....
Правда, из условия не совсем ясно, нужно ли учитывать все перестановки. Вполне возможно, что итоговый результат может выглядеть и таким образом:
1. Одиннадцать единиц
2. Девять единиц и одна двойка
3. Восемь единиц и одна тройка
...
N. Три тройки и одна двойка.

Последний раз редактировалось mihali4; 13.10.2008 в 14:32.
mihali4 вне форума Ответить с цитированием
Старый 14.10.2008, 09:39   #9
Vladko
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 17
По умолчанию

Стандартный подход конечно это банальный перебор и без рекурсий не обойтись, хотя некоторые умельцы могут и циклами обойтись. Главная идея перебрать все варианты, че и предлагает Михалыч.
Ну а другой вариант это нехилое знание построения рекурсивных алгоритмов.
Вот сижу я дома думаю че это моя рекурсия по перебору путей не работает(выпендриться млин захотел), а тут папа с работы приходит и "бэмс" решение за 15-20 минут вывел(сам выводил, потому что не его специализация и подобным не занимаеться), а я спрограмировал его идею где-то за столько же...
Сканера у мя нету, так что просто код, а сам объяснить почему оно именно так слабо... В целом принцип тот же что и у Фибоначчи.
Код:
int calcPath(N, K)
{
	int returnval=0;
	int i, j;
	int* cyclicbuff;

	if(K==1)
		return 1;	

	cyclicbuff = (int*) malloc (sizeof(int)*K);

	for(j=0; j<K; j++)
		cyclicbuff[j] = 1 << j; // placing 2^j into corresponding locations

	/* Calculating */
	for(j=K; j<N; j++)
		for(i=1;i<K;i++)
			cyclicbuff[ (j%K) ] += cyclicbuff[ ((j+i)%K) ];

	returnval = cyclicbuff[ ((N-1)%K) ];
	free(cyclicbuff);
	
	return returnval;
}

Последний раз редактировалось Vladko; 14.10.2008 в 09:43.
Vladko вне форума Ответить с цитированием
Старый 14.10.2008, 21:30   #10
brainstorm
Новичок
Джуниор
 
Регистрация: 07.10.2008
Сообщений: 2
По умолчанию

спасибо огромное!
принцип использования рекурсии понятен, попробую разобраться в коде и решить несколько задач такого типа.
может тогда дойдет.
brainstorm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните пожалуйста TheHerd Паскаль, Turbo Pascal, PascalABC.NET 12 04.04.2008 21:33
Объясните, пожалуйста смысл строки - res=d.year > year ? -1: (d.year < year? 0:1) Fynj Помощь студентам 2 17.12.2007 17:50