Форум программистов, компьютерный форум CyberForum.ru

Компьютерная игра (платформы) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
10.11.2013, 00:21     Компьютерная игра (платформы) #1
Во многих старых играх с двумерной графикой можно столкнуться с подобной ситуацией. Какой-нибудь герой прыгает по платформам (или островкам), которые висят в воздухе. Он должен перебраться от одного края экрана до другого. При этом при прыжке с одной платформы на соседнюю, у героя уходит |y2–y1| единиц энергии, где y1 и y2 — высоты, на которых расположены эти платформы. Кроме того, у героя есть суперприём, который позволяет перескочить через платформу, но на это затрачивается 3·|y3–y1| единиц энергии. Конечно же, энергию следует расходовать максимально экономно.

Предположим, что вам известны координаты всех платформ в порядке от левого края до правого. Сможете ли вы найти, какое минимальное количество энергии потребуется герою, чтобы добраться с первой платформы до последней?

В первой строке записано количество платформ n (1 ≤ n ≤ 30000). Вторая строка содержит n натуральных чисел, не превосходящих 30000 — высоты, на которых располагаются платформы.

Выведите единственное число — минимальное количество энергии, которую должен потратить игрок на преодоление платформ (конечно же в предположении, что cheat-коды использовать нельзя).

Примеры тестов
входные данные
3
1 5 10
выходные данные
9

входные данные
3
1 5 2
выходные данные
3

Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main()
{
    vector <int> v;
    vector <int> q;
    int s=0,n,k,rez=0;
    cin >> n;
    for(int i=0;i<n;i++)
    {
        cin >> k;
        v.push_back(k);
    }
    rez=0;
    for(int i=2;i<n;i++)
    {
        if ((v[i-1]+v[i-1])>(v[i]))
            {
                rez+=v[i];
            }
        if ((v[i-1]+v[i-1])<=(v[i]))
            {
                rez+=(v[i-1]+v[i-1]);
            }
    }
    cout << rez << "\n";
    system("pause");
}

вот моя пародия на код
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 00:21     Компьютерная игра (платформы)
Посмотрите здесь:

компьютерная графика и анимация C++
C++ Мобильные платформы и С++
Макрос определния платформы C++
Компьютерная графика 3D. C++
Компьютерная графика в c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
10.11.2013, 00:26     Компьютерная игра (платформы) #2
newyork7776, а почему пародия? Не работает?
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
10.11.2013, 00:28     Компьютерная игра (платформы) #3
Цитата Сообщение от newyork7776 Посмотреть сообщение
1 ≤ n
Если (n==1) 0 печатать?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.11.2013, 00:29     Компьютерная игра (платформы) #4
На ******** есть похожие задачи. Можешь спросить там!
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
10.11.2013, 00:30  [ТС]     Компьютерная игра (платформы) #5
Цитата Сообщение от Folko Посмотреть сообщение
newyork7776, а почему пародия? Не работает?
пашет но ответ кривой
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
10.11.2013, 01:32     Компьютерная игра (платформы) #6
Я решил. Вот код с комментариями <КЭП> :
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
#include<iostream>
using namespace std;
 
void main()
{
    
    //Инициализация переменных
    int n;//колличество платформ
    cin>>n;//Ввод
    int* CoordsY = new int[n];//Массив с координатами платформ
    int* MinE = new int[n];//Массив с минимальными энергозатратами от начала до платформы
 
    //Ввод
    for(int i=0; i<n;i++)
        cin>>CoordsY[i];
 
    MinE[0]=0;//От начала до начала энергия не потратится
    MinE[1]=abs(CoordsY[1]-CoordsY[0]);//Здесь тоже однозначно
 
    int E1,E2;//Затраты энергиив при разных случаях
    for (int i=2;i<n;i++)//Найдем все остальные
    {
        E1=abs(CoordsY[i]-CoordsY[i-1]); //Энергия при обычном прыжке
        E2=3*abs(CoordsY[i]-CoordsY[i-2]); //Энергия при СУПЕР-прыжке
 
        //Найдем минимальную энергию, которую может затратить игрок
        if (E1+MinE[i-1]<E2+MinE[i-2])// Если выгоднее прыгнуть с ближайшей, то
            MinE[i]=E1+MinE[i-1];//прыгаем с ближайшей
        else // а если выгоднее прыгуть с дальней
            MinE[i]=E2+MinE[i-2];//то прыгаем с дальней
    }
 
    //Вывод
    cout<<MinE[n-1];
 
    system("pause >> void");
}
newyork7776
 Аватар для newyork7776
346 / 339 / 79
Регистрация: 21.05.2013
Сообщений: 1,305
Завершенные тесты: 1
10.11.2013, 12:59  [ТС]     Компьютерная игра (платформы) #7
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
 
int step(int a,int b,int c)
{
    if ((abs(a-b))>=(3*abs(a-c))) return (3*(abs(a-c)));
    else return (abs(a-b));
}
 
int main()
{
   vector <int> v;
   int q=2,n,k;
   cout << "Enter N = ";cin >> n;
   for(int i=0;i<n;i++)
   {
        cin >> k;
        v.push_back(k);
   }
   int rez=0;
   while (q==n)
   {
       if ((step(v[q],v[q-1],v[q-2])) == (3*(abs(v[q]-v[q-2]))))
       {
           q+=2;
           rez+=(3*abs(v[q]-v[q-2]));
       }
       else 
       {
           q++;
           rez+=abs(v[q]-v[q-1]);
       }
   }
    cout << rez;
    system("pause");
}

может я не понимаю основу идею,но делаю примерно так ,где я ошибся?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2013, 00:41     Компьютерная игра (платформы)
Еще ссылки по теме:

C++ Компьютерная графика
Компьютерная графика C++

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

Или воспользуйтесь поиском по форуму:
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
11.11.2013, 00:41     Компьютерная игра (платформы) #8
1) почему
C++
1
while (q==n)
??


2)Чтобы правильно оценивать, с какой платформы нужно прыгать, нужно знать не только, сколько энергии затратится, но и сколько энергии уже затратилось. Другими словами, когда выбираешь лучший путь, минимальная энергия будет равна min(Eот дальней+Eот начала до дальней, Eот ближней+Eот начала до ближней)
где Eот дальней равна (3*abs(a-c), а Eот начала до дальней равно минимальной энергии от начала до этой платформы. Ее значение можно хранить в дополнительно массиве, созданном специально для хранения минимальных энергозатрат. Именно поэтому важно также находить минимальное расстояние от начала до каждой платформы, то есть использовать q++
Попробуй разобрать пример с вводимыми числами: 1 5 2 5
Yandex
Объявления
11.11.2013, 00:41     Компьютерная игра (платформы)
Ответ Создать тему
Опции темы

Текущее время: 13:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru