С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить программу по назначению припусков на механическую обработку отверстий согласно заданным диаметрам. Программа должна включать графический инт http://www.cyberforum.ru/cpp-beginners/thread311655.html
Составить программу по назначению припусков на механическую обработку отверстий согласно заданным диаметрам. Программа должна включать графический интерфейс и справочную систему.
C++ Фоновая музыка в программе Такой вопрос - все знают програмки состоящие из одного exe файла и при этом в нем играет музычка (<del>keygen например</del>). Как это делается? и особенно если надо фоновую музыку в формате mp3 http://www.cyberforum.ru/cpp-beginners/thread311653.html
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,...
C++ Подключение библиотек include
подскажите как включить include библиотеки (iostream,conio i t.d)
C++ Дизассемблированный код http://www.cyberforum.ru/cpp-beginners/thread311628.html
иногда вижал студио выводит дизасемблированный код скажи, как в нем что то понемать
C++ Определить, является ли заданная матрица N-го порядка магическим квадратом, т.е. такой, в которой сумма элементов во всех строках и столбцах одинакова Определить, является ли заданная матрица N-го порядка магическим квадратом, т.е. такой, в которой сумма элементов во всех строках и столбцах одинакова. Помогите переделать задачу что в ней ... подробнее
Ko4_ka
5 / 3 / 3
Регистрация: 07.12.2017
Сообщений: 15
23.02.2018, 22:30 0

Обход лабиринта

23.02.2018, 22:30. Просмотров 3115. Ответов 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
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
//8.25 Дейтлы стр. 582 Обход лабиринта. #35 .46 x120
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
using namespace std;
 
//глобальные переменные для того, что бы рекурсивная функция не ходила назад, то есть эти переменные
//хранят предыдущий ход
int X;
int Y;
 
int mazeTraverse(int[][12], int, int, int = 1); //аргумент по умолчанию используется для цикла
 
int main()
{
    //массив лабиринта
    int labyrinth[12][12] =
    {
        { 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35 },
        { 35, 46, 46, 46, 35, 46, 46, 46, 46, 46, 46, 35 },
        { 46, 46, 35, 46, 35, 46, 35, 35, 35, 35, 46, 35 },
        { 35, 35, 35, 46, 35, 46, 46, 46, 46, 35, 46, 35 },
        { 35, 46, 46, 46, 46, 35, 35, 35, 46, 35, 46, 46 },
        { 35, 35, 35, 35, 46, 35, 46, 35, 46, 35, 46, 35 },
        { 35, 46, 46, 35, 46, 35, 46, 35, 46, 35, 46, 35 },
        { 35, 35, 46, 35, 46, 35, 46, 35, 46, 35, 46, 35 },
        { 35, 46, 46, 46, 46, 46, 46, 46, 46, 35, 46, 35 },
        { 35, 35, 35, 35, 35, 35, 46, 35, 35, 35, 46, 35 },
        { 35, 46, 46, 46, 46, 46, 46, 35, 46, 46, 46, 35 },
        { 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35 },
    };
 
    //переменные для определения отправной точки
    int i;
    int j;
 
    //рандомно засеять отправную точку в массив
    srand(time(0));
    do
    {
        i = 1 + rand() % 11;
        j = 1 + rand() % 11;
    } while (labyrinth[i][j] == 35);
 
    Y = i;
    X = j;
 
    mazeTraverse(labyrinth, i, j);
    cout << "\nyou found a way out\n";
    return 0;
}
 
int mazeTraverse(int m[][12], int y, int x , int c)
{
    system("pause");
 
    //присваивание текущей позиции "x"
    m[y][x] = 120;
 
    //вывод массива
    for (int i = 0; i < 12; i++)
    {
        for (int j = 0; j < 12; j++)
            cout << setw(2) << static_cast <char>(m[i][j]);
        cout << endl;
    }
 
    //проверка на выход из лабиринта
    if (y == 0 || x == 0 || y == 11 || x == 11)
    {
        return 0;
    }
    
    //присваивание текущей позиции "."
    m[y][x] = 46;
 
    //цикл на приоритет ходов
    while (c != 5)
    {
        //ход 1
        if (c == 1 && m[y - 1][x] == 46 && (y - 1) != Y) //если ок, ходим наверх
        {
            if (m[y - 1][x] == 46 && m[y][x + 1] == 46 && (x + 1) != X) //если ок, ходим направо
            {
                c = 2;
                Y = y;
                X = x;
                return mazeTraverse(m, y, x + 1, c);
            }
            c = 1;
            Y = y;
            X = x;
            return mazeTraverse(m, y - 1, x, c);
        }
        else if (c == 1 && m[y - 1][x] == 35 && m[y][x + 1] == 35 && m[y][x - 1] == 35) //если зашли в тупик, то ходим назад
            Y = 0;
        //ход 2
        if (c == 2 && m[y][x + 1] == 46 && (x + 1) != X) //если ок, ходим напрво
        {
            if (m[y][x + 1] == 46 && m[y + 1][x] == 46 && (y + 1) != Y) //если ок, ходим вниз
            {
                c = 3;
                Y = y;
                X = x;
                return mazeTraverse(m, y + 1, x, c);
            }
            c = 2;
            Y = y;
            X = x;
            return mazeTraverse(m, y, x + 1, c);
        }
        else if (c == 2 && m[y - 1][x] == 35 && m[y][x + 1] == 35 && m[y + 1][x] == 35) //если зашли в тупик, то ходим назад
            X = 0;
        //ход 3
        if (c == 3 && m[y + 1][x] == 46 && (y + 1) != Y) //если ок, ходим вниз
        {
            if (m[y + 1][x] == 46 && m[y][x - 1] == 46 && (x - 1) != X) //если ок, ходим налево
            {
                c = 4;
                Y = y;
                X = x;
                return mazeTraverse(m, y, x - 1, c);
            }
            c = 3;
            Y = y;
            X = x;
            return mazeTraverse(m, y + 1, x, c);
        }
        else if (c == 3 && m[y + 1][x] == 35 && m[y][x + 1] == 35 && m[y][x - 1] == 35) //если зашли в тупик, то ходим назад
            Y = 0;
        //ход 4
        if (c == 4 && m[y][x - 1] == 46 && (x - 1) != X) //если ок, ходим налево
        {
            if (m[y][x - 1] == 46 && m[y - 1][x] == 46 && (y - 1) != Y) //если ок, ходим наверх
            {
                c = 1;
                Y = y;
                X = x;
                return mazeTraverse(m, y - 1, x, c);
            }
            c = 4;
            Y = y;
            X = x;
            return mazeTraverse(m, y, x - 1, c);
        }
        else if (c == 4 && m[y - 1][x] == 35 && m[y + 1][x] == 35 && m[y][x - 1] == 35) //если зашли в тупик, то ходим назад
            X = 0;
        c++;
        if (c == 5)
            c = 1;
    }
}


Вернуться к обсуждению:
Обход лабиринта
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2018, 22:30
Готовые ответы и решения:

Обход лабиринта
Добрый вечер. Стоит задача обойти лабиринт, заданный матрицей (вводятся...

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход"
Ребятаа, обьясните чем различается: Обход в прямом направлении и Итерационный...

Выход из лабиринта
Всем привет, возник вопрос по поводу лабиринта. Посмотрев форум не нашел такого...

Проход лабиринта в C++
Ребята, помогите...вобщем, необходимо пройти по лабиринту и найти самый...

Прохождение лабиринта
Как написать программу для прохождения лабиринта? У меня не получается. Саму...

1
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru