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

Волновой алгоритм, неправильная работа при втором запуске - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Необходимо понять процесс решения http://www.cyberforum.ru/cpp-beginners/thread185542.html
Даны 4 точки: A (x1, y1, z1), B (x2, y2, z2), C (x3, y3, z3), D (x4, y4, z4) Задания: Составить уравнения: 1. Прямой AB 2. Плоскости ABC 3. Прямой DM, перпендикулярной плоскости ABC 4. Прямой CN, параллельной прямой AB
C++ Индексация. Народ объясните туповатому студенту задание такое Создать некую библиотеку должников где есть поля: имя,книга и дата Записей должно быть не менее 10,и все эти записи с помощью индексов и фильтров отсортировать по имени по убыванию,как отсортировать и вывести я знаю,а как работать через фильтры и индексы до меня в упор не доходит,объясните на пальцах,очень прошу. вот что сделала using... http://www.cyberforum.ru/cpp-beginners/thread185533.html
Преобразование 'time_t' в 'unsigned int' C++
Массив предназначен для хранения значений ростов двенадцати человек. С помощью датчика случайных чисел заполнить массив целыми значениями, лежащими в диапазоне от 163 до 190 включительно. На основе данных массива вычислить: а) среднее арифметическое значение роста и вывести его на экран; б) минимальное значение роста и индекс соответствующего элемента массива (если таких элементов несколько,...
C++ Задана символьная матрица размером NxM.Определить кол-во различных элементов(Повторяющиеся считать только 1 раз).
Помогите пожалуйста . Не могу создать динамческий символьный массив. Остальную часть вроде уже составил, но никак не могу создать массив.
C++ напишите программу на с++ с данной блок схемы http://www.cyberforum.ru/cpp-beginners/thread185522.html
1) Условие задачи: Дано целочисленная матрица n x m определить: 1) MAX элемент в первом столбце и MIN элемент в последнем столбце 2) MAX элемент во второй строке и MIN элемент в предпоследней строке и указать их местонахождения 2) Математическая формулировка 2)Данные 1) Исходные данные:
C++ получения исходника из exe у меня есть один файл, и я хочу получить его исходник. и у меня такой вопрос:как мне это сделать? P.S. ответов типа "это невозможно" не писать! подробнее

Показать сообщение отдельно
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130

Волновой алгоритм, неправильная работа при втором запуске - C++

03.11.2010, 01:53. Просмотров 780. Ответов 0
Метки (Все метки)

Вероятно многие из вас видели видео по волновому алгоритму. Так вот, я завёл этот код в функцию, и у меня появилась такая проблема, что если эту функцию вызвать второй раз, то линия рисуется совсем не так как хотелось бы...

вот сама функция:
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
56
57
58
59
60
61
62
bool CGame::addWaypoint(int x1, int y1, int x2, int y2)
{
    wp = 1;
 
    if(map[x1][y1] == WALL || map[x2][y2] == WALL)
    {
        Show();
        MessageBox(0,"wall","wall",MB_OK | MB_SYSTEMMODAL);
        return false;
    }
 
    vector<pair<int, int> > oldWave;
 
    oldWave.push_back(pair<int,int>(x1,y1));    //start point
    int nstep = 0;
    map[x1][y1] = nstep;                        //start point
    const int dx[] = {0,1,0,-1};
    const int dy[] = {-1,0,1,0};
 
    while(oldWave.size() > 0)
    {
        ++nstep;
        wave.clear();
        for(vector<pair<int,int> >::iterator i = oldWave.begin(); i != oldWave.end(); ++i)
        {
            for(int d = 0; d < 4; ++d)
            {
                int nx = i -> first + dx[d];
                int ny = i -> second + dy[d];
                if(map[nx][ny] == -1)
                {
                    wave.push_back(pair<int,int>(nx,ny));
                    map[nx][ny] = nstep;
                    if(nx == x2 && ny == y2) //end point
                        goto done;
                }
            }
        }
        oldWave = wave;
    }
done:;
    int x = x2; //end point
    int y = y2; //end point
    wave.clear();
    wave.push_back(pair<int, int>(x,y));
    while(map[x][y] != 0)
    {
        for(int d = 0; d < 4; ++d)
        {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if(map[x][y] - 1 == map[nx][ny])
            {
                x = nx;
                y = ny;
                wave.push_back(pair<int, int>(x,y));
                break;
            }
        }
    }
    return true;
}
и вот, если эту функцию вызвать 2 раза подряд

addWaypoint(1,1,N-2,N-2); //(левый,верхний,правый,нижний)
addWaypoint(1,58,58,1); //(левый,нижний,правый,верхний)

если сделать вот таким вот способом, то линия рисуется от левого верхнего к правому верхнему углу(), хотя последняя функция должна направить её от правого нижнего к левому верхнему.
Пробовал между ними ставить wave.erase(), однако безуспешно, вот думаю где что нужно подкрутить. Думаю что проблема кроется где-то в массиве, вот прошу помощи. а то всё перепробовал, уже не знаю что и делать...

Добавлено через 2 часа 20 минут
вроде разобрался, в массив записывались числа, которые в дальнейшем мешали новому построению пути
map[nx][ny] = nstep;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru