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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2010, 20:10   #1
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
Восклицание Волновой алгоритм (алгоритм Ли)

Здравствуйте!
У кого-нибудь есть красивая реализация волнового алгоритма (алгоритма Ли) ?
Дело в том, что я игрушку захотел написать (что-то вроде Пакмэна),
и мне бы этот алгоритм очень сильно помог.
MrRockchip вне форума Ответить с цитированием
Старый 09.05.2010, 21:32   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Используется BFS(поиск в ширину).
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 09.05.2010, 21:57   #3
MrRockchip
Пользователь
 
Аватар для MrRockchip
 
Регистрация: 30.05.2009
Сообщений: 26
Восклицание Волновой алгоритм (алгоритм Ли)

Наконец-то нашёл хороший, красивый и работающий алгоритм!
Причём он находит путь быстрее волнового! (потому что рекурсивный )

Вот он (может быть, пригодится кому-нибудь) :

Код:
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <windows.h>

using namespace std;

#include <stdio.h>

#define FALSE 0
#define TRUE 1

#define NROWS 6
#define MCOLS 6

// Symbols:
// '.' = open
// '#' = blocked
// 'S' = start
// 'G' = goal
// '+' = path
// 'x' = bad path
char maze[NROWS][MCOLS] = {
        {'S','.','.','.','#','#'},
        {'#','.','#','.','.','.'},
        {'#','.','#','#','.','#'},
        {'.','.','#','.','#','#'},
        {'#','.','.','.','#','G'},
        {'#','.','#','.','.','.'}
};


void display_maze(void);
int find_path(int x, int y);


int
main(void)
{
        display_maze();

        if ( find_path(0, 0) == TRUE )
                printf("Success!\n");
        else
                printf("Failed\n");

        display_maze();
        int i;
        cin >> i;
        return 0;
}
// main()


void
display_maze(void)
{
        int i;

        printf("MAZE:\n");
        for ( i = 0; i < NROWS; i++ )
                printf("%.*s\n", MCOLS, maze[i]);
        printf("\n");

        return;
}


int
find_path(int x, int y)
{
        // If x,y is outside maze, return false.
        if ( x < 0 || x > MCOLS - 1 || y < 0 || y > NROWS - 1 ) return FALSE;

        // If x,y is the goal, return true.
        if ( maze[y][x] == 'G' ) return TRUE;

        // If x,y is not open, return false.
        if ( maze[y][x] != '.' && maze[y][x] != 'S' ) return FALSE;

        // Mark x,y part of solution path.
        maze[y][x] = '+';

        // If find_path North of x,y is true, return true.
        if ( find_path(x, y - 1) == TRUE ) return TRUE;

        // If find_path East of x,y is true, return true.
        if ( find_path(x + 1, y) == TRUE ) return TRUE;

        // If find_path South of x,y is true, return true.
        if ( find_path(x, y + 1) == TRUE ) return TRUE;

        // If find_path West of x,y is true, return true.
        if ( find_path(x - 1, y) == TRUE ) return TRUE;

        // Unmark x,y as part of solution path.
        maze[y][x] = 'x';

        return FALSE;
}
// find_path()
MrRockchip вне форума Ответить с цитированием
Старый 09.05.2010, 22:26   #4
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Это поиск в глубину(DFS). Сложность у обоих одинаковая, но этот из - за рекурсии будет помедленее, а не побыстрее.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 10.05.2010, 13:26   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Волновой алгоритм реализуется очень легко.
Получаете всех соседей текущей точки и переходите к самому близкому.
Я недавно писал распознавание графика на отсканированном изображении и за пару часов написал сносную реализацию волнового алгоритма.
MaTBeu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм сферическая волна ArtInt Общие вопросы Delphi 2 24.04.2010 15:43
Алгоритм VladimirAleks Помощь студентам 2 29.10.2009 13:11
алгоритм lucky Паскаль, Turbo Pascal, PascalABC.NET 4 07.05.2009 12:56
Волновой алгоритм поиска Merkator Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 12.02.2009 16:15
Алгоритм Rifler Паскаль, Turbo Pascal, PascalABC.NET 3 30.03.2008 01:33