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

Обход лабиринта - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Составить программу по назначению припусков на механическую обработку отверстий согласно заданным диаметрам. Программа должна включать графический инт http://www.cyberforum.ru/cpp-beginners/thread311655.html
Составить программу по назначению припусков на механическую обработку отверстий согласно заданным диаметрам. Программа должна включать графический интерфейс и справочную систему.
C++ Фоновая музыка в программе Такой вопрос - все знают програмки состоящие из одного exe файла и при этом в нем играет музычка (<del>keygen например</del>). Как это делается? и особенно если надо фоновую музыку в формате mp3 http://www.cyberforum.ru/cpp-beginners/thread311653.html
C++ Builder Как считать из StringGrid только первых 2 символа (или только int)?
Сначала StringGrid1->Cells=IntToStr(tmp)+"%"; А в другой кнопке мне нужно обработать ячейки (но выдает еррор изза того что не все данные int). P.S: может важно: tmp всегда меньше 100, больше 0 и целое Спасибо!
C++ Найти ошибку.
задание: Шаг1. Выбрать начальный шаг sh=(b-a)/4. Положить x0=a. Вычислить F(x0). Шаг2. Положить x1=x0+sh. Вычислить F(x1). Шаг3. Сравнить F(x0) и F(x1). Если F(x0)>F(x1), то перейти к шагу 4, иначе -- к шагу 5. Шаг4. Положить x0=x1 и F(x0)=F(x1). Проверить условие принадлежности x0 интервалу . Если a < x0 < b, то перейти к шагу 2, иначе -- к шагу 5. Шаг5. Проверка на окончание поиска:...
C++ подключение библиотек include http://www.cyberforum.ru/cpp-beginners/thread311648.html
подскажите как включить include библиотеки (iostream,conio i t.d)
C++ Дизассемблированный код иногда вижал студио выводит дизасемблированный код скажи, как в нем что то понемать подробнее

Показать сообщение отдельно
aveschekist
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 13
03.06.2011, 12:59     Обход лабиринта
Стал делать задачу из книги Дейтлов про лабиринт, и наткнулся на некоторую проблему.

Текст упражнения:

"Существует простой алгоритм прохода через лабиринт, который гарантирует, что вы найдете выход (если он, конечно, существует). Если лабиринт не имеет выхода, то вы вернетесь в тому месту, из которого вышли. Касайтесь правой рукой стены (которая находится справа от вас) и начинайте движение вперед. Все время касайтесь рукой стены. Если лабиринт поворачивает направо, вы должны следовать за поворотом стены направо. И если вы не будете отпускать руку, то в конечном счете вы доберетесь до выхода из лабиринта.

Напишите рекурсивную функцию mazeTraverse прохода через лабиринт. Функция должна получать в качестве аргументов массив символов 12 на 12, представляющий лабиринт, и отправную точку. В процессе поиска выхода из лабиринта mazeTraverse помещает символ X в каждый пройденный квадрат пути. Функция должна перерисовывать лабиринт после каждого перемещения, чтобы пользователь мог наблюдать процесс решения задачи."


В лабиринте:
  • '#' - стенки лабиринта;
  • '.' - дорожка в лабиринте;
  • 'X' - пройденный квадрат;

Мой фрагмент кода:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
const int size1 = 12;
 
 
void mazeTraverse( char [][ size1 ], const int *const, const int *const );
void drawnLabirint( const char [][ size1 ], const int *const );
int motionDetection( char [][ size1 ], const int *const, const int *const );
 
 
int main()
{
    //const int size = 12;
    char labirint[ size1 ][ size1 ] = {  
                                           { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
                       { '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
                       { '.', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#', },
                       { '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#', },
                       { '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.', },
                       { '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', },
                       { '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#', },
                       { '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#', },
                       { '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#', },
                       { '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#', },
                       { '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#', },
                       { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
                                         };
    int i = 2;
    int j = 0;
 
    cout << "Go, go, go!!!\n\n";
 
    mazeTraverse( labirint, &i, &j );
 
    return 0;
} // end function main
 
int motionDetection( char a[][ size1 ], const int *const i, const int *const j )
{
    int motion;
 
    if( *j + 1 < size1 && a[ *i + 1 ][ *j ] == '#' )
        motion = 0;         // forward
    else if( *j - 1 != 0 &&  a[ *i - 1 ][ *j ] == '#' )
        motion = 1;                       // back
    else if( *i - 1 != 0 && a[ *i ][ *j + 1 ] == '#' )
        motion = 2;               // up
    else 
        motion = 3;              // down
 
    return motion;
} // end function motionDetection
 
void mazeTraverse( char a[ ][ size1 ], const int *const row, const int *const column )
{
    static int motion = motionDetection( a, row, column ); // ищем праваой рукой стену, при входе в лабиринт
 
    int i = *row;
    int j = *column;
    
    if( a[ i ][ j ] == '.' )
        a[ i ][ j ] = 'X';
    else 
        a[ i ][ j ] = '.';
 
    drawnLabirint( a, &size1 );
 
    switch( motion )
    {
        case 0:
            if( j + 1 < size1 && a[ i + 1 ][ j ] == '#' && a[ i ][ j + 1 ] != '#' )
                j++;
            else if( a[ i + 1 ][ j ] != '#' )               
                {
                    motion = 3;
                    i++;
                } // end if..else
            else if( a[ i - 1 ][ j ] != '#' )
                {
                    motion = 2;
                    i--;
                } // end if..else               
            else
                motion = 1;
            break;
 
        case 1:
            if ( j - 1 > 0 && a[ i - 1 ][ j ] == '#' && a[ i ][ j - 1 ] != '#' )
                j--;
            else if( a[ i - 1 ][ j ] != '#' )           
            {
                motion = 2;
                i--;
            } // end if..else
            else if( a[ i + 1 ][ j ] != '#' )
            {
                motion = 3;
                i++;
            } // end if..else
            else
                motion = 0;
            
            break;
 
        case 2:
            if( i - 1 > 0 && a[ i ][ j + 1 ] == '#' && a[ i - 1 ][ j ] != '#' )
                i--;
            else if( a[ i ][ j + 1 ] != '#' )           
            {
                motion = 0;
                j++;
            } // end if..else
            else if( a[ i ][ j - 1 ] != '#' )
            {
                motion = 1;
                j--;
            } // end if..else   
            else
                motion = 3;
            break;
 
        case 3:
            if( i + 1 < size1 && a[ i ][ j - 1 ] == '#' && a[ i + 1 ][ j ] != '#' )
                i++;
            else if( a[ i ][ j - 1 ] != '#' )
            {
                motion = 1;
                j--;
            } // if..else           
            else if( a[ i ][ j + 1 ] != '#' )
            {
                motion = 0;
                j++;
            } // if..else
            else
                motion = 2;
            break;
 
        default:
            cout << "Unknown command!!!\n\n";
            break;
    } // end switch
 
    if( i > 0 && i < size1 - 1 && j > 0 && j < size1 - 1 )
        mazeTraverse( a, &i, &j );
    else
    {
        a[ i ][ j ] = 'X';
        drawnLabirint( a, &size1 );
    } // end if..else
 
} // end function mazeTraverse
 
 
void drawnLabirint( const char a[][ size1 ], const int *const n )
{
    cout << endl;
 
    for( int i = 0; i < *n; i++ )
    {
        for( int j = 0; j < *n; j++ )
            cout << setw( 3 ) << a[ i ][ j ];       
 
        cout << endl;
    } // end for
    Sleep( 1000 );
} // end function drawnLabirint
Правильный ли у меня подход в реализации рекурсивных функций?
Или же даннай задача делается значительно проще( для данной постановки задачи)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru