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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2009, 11:49   #1
mirawoo
Пользователь
 
Регистрация: 26.02.2008
Сообщений: 56
По умолчанию Задача на C

Друзья, помогите, пожалуйста, с такой задачкой:
Дана шахматная доска M*N с разными монетками на каждом квадрате.
Необходимо из стартовой левой нижней позиции перебраться вверх таким образом, что бы собрать наибольшую сумму монет.
По диагонали ходить нельзя. Можно только вправо и вверх
Прога не должна работать путем поиска самых больших ближайших чисел, так как самое большое число может находится
на другом конце матрицы.
Спасибо заранее.
Sorry za translit - Ne znaju, kak na Debain postavit Russkiy!
mirawoo вне форума Ответить с цитированием
Старый 18.08.2009, 15:27   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Раз двигаться можно только вправо и вверх, то, может, перебором?

А вообще можно граф построить (каждая клетка связана с той, что выше, и той, что правее) и работать уже с ним.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 18.08.2009, 16:15   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Можно попробовать прикрутить алгоритмы поиска кратчайшего пути. волновой там или еще какой. Стоимость монетки - есть стоимость пути. Ну или, чтобы не превращать это в поиск самого длинного пути, стоимость пути = 100 - номинал монеты
pu4koff вне форума Ответить с цитированием
Старый 18.08.2009, 16:50   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Может что-то типа
Код:
for (y = 0; y < n; y++)
	for (x = 0; x < m; x++)
		a[y][x] = max(a[y - 1][x], a[y][x - 1]);
В общем, выбор из клетки левее или ниже.

Последний раз редактировалось Somebody; 18.08.2009 в 17:04.
Somebody вне форума Ответить с цитированием
Старый 18.08.2009, 17:18   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Somebody неа, ибо ты ведь не знаешь, какие монетки будут дальше этого пути. на текущем шаге ты сделаешь выгодное решение, но на следующем может оказаться так, что выгоднее было пойти по другому пути
ну вот пример:

10 10 10 10 10
10 10 10 10 10
90 10 10 10 10
10 10 10 10 10
10 20 10 10 10

идем из левого нижнего угла. на первом же ходу твой алгоритм даст сбой
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 18.08.2009 в 17:24.
pproger вне форума Ответить с цитированием
Старый 18.08.2009, 17:31   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Ой, там имелось в виду +=. В каждом элементе будет наибольшая возможная сумма по пути до него, тогда для каждой клетки надо только выбрать предыдущую. В общем, типа:
Код:
int m, n;
scanf("%d %d", &m, &n);
int a[99][99];
char prev[99][99];
int x, y;
for (x = 0; x < m; x++)
	a[0][x] = 0;
for (y = n; y > 0; y--)
	for (x = 1; x <= m; x++)
	{
		a[y][0] = 0;
		scanf("%d", &a[y][x]);
	}
for (y = 1; y <= n; y++)
	for (x = 1; x <= m; x++)
     if (a[y - 1][x] > a[y][x - 1])
			a[y][x] += a[y - 1][x], prev[y][x] = 'y';
		else
			a[y][x] += a[y][x - 1], prev[y][x] = 'x';
char path[m + n - 1];
path[sizeof(path)/sizeof(path[0]) - 1] = 0;
x = m, y = n;
for (int i = m + n - 3; i >= 0; i--)
	path[i] = prev[y][x] == 'y' ? (y--, '^') : (x--, '>');
puts(path);

Последний раз редактировалось Somebody; 18.08.2009 в 17:34.
Somebody вне форума Ответить с цитированием
Ответ


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