Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 10

Поиск пути в лабиринте

24.11.2016, 16:56. Показов 5593. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
есть задача пройти лабиринт
{1 1 1 1 1 0 1
0 0 0 0 0 0 0
1 1 1 1 0 1 1
1 0 0 0 0 1 1
1 0 1 0 0 0 1
1 0 0 0 1 0 1
1 1 1 1 1 1 1}
начальная позиция х= 5, у=4
это исходный код на паскаль, нужно перевести на с++
благодарен всем кто откликнется!



Pascal
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
program LABYRINTH_BREADTH_FIRST (input, output); 
const 
M = 7; N = 7; {The dimensions of the labyrinth.} 
MN = 49; {The number of cells M*N. } 
var 
LAB, LABCOPY : array[1..M, 1..N] of integer; {Labyrinth and its copy.} 
CX, CY : array[1..4] of integer; {4 production rules.} 
FX, FY : array[1..MN] of integer; {The “front” to store opened nodes.} 
CLOSE, {The counter for a closed node.} 
 

 NEWN, {The counter for an opened node.} 
K, {The counter for a production.} 
X, Y, {The starting position of the agent.} 
U, V, I, J : integer; 
YES : boolean; 
procedure BACK(U, V : integer); {Collect the path from the exit to start.} 
{INPUT: 1) U, V – the coordinates of the exit, and 2) global LABCOPY. 
OUTPUT: LAB.} 
var K, UU, VV : integer; 
begin {BACK} 
LAB[U,V] := LABCOPY[U,V]; {The exit position is marked.} 
K := 0; 
repeat {The search within 4 productions. Search for cell LABCOPY[UU,VV] 
with the mark which is 1 less than LABCOPY[U,V].} 
K := K + 1; UU := U + CX[K]; VV := V + CY[K]; 
if (1 <= UU) and (UU <= M) and (1 <= VV) and (VV <= N) 
then {Inside the boarders} 
if LABCOPY[UU,VV] = LABCOPY[U,V]1 
then 
begin 
LAB[UU,VV] := LABCOPY[UU,VV] ; {Marking a cell in LAB.} 
U := UU; V := VV; K := 0; {Swapping the variables.} 
end; 
until LABCOPY[U, V] = 2; 
end; {BACK} 
begin {Main program} 
{ 1) Reading the labyrinth.} 
for J := N downto 1 do 
begin 
for I := 1 to M do 
begin read(LAB[I,J]); 
LABCOPY[I,J]:= LAB[I,J]; 
end 
readln; 
end; 
{ 2) Reading the starting position of the agent.} 
read(X,Y); LABCOPY[X,Y]:=2; 
{ 3) Initialising 4 production rules} 
CX[1] := -1; CY[1] := 0; {Go West. 2 } 
CX[2] := 0; CY[2] := -1; {Go South. 1 * 3 } 
CX[3] := 1; CY[3] := 0; {Go East. 4 } 
CX[4] := 0; CY[4] := 1; {Go North. } 
{ 4) Assigning initial values.} 
FX[1] := X; FY[1] := Y; CLOSE := 1; NEWN := 1; YES := false; 
 

 { 5) Breadth-first search, i.e. the “wave” algorithm.} 
if (X = 1) or (X = M) or (Y = 1) or (Y = N) 
then {If an exit is reached then finish.} 
begin YES := true; U := X; V := Y; 
end; 
if (X > 1) and (X < M) and (Y > 1) and (Y < N) 
then 
repeat {The loop through the nodes.} 
X := FX[CLOSE]; Y := FY[CLOSE]; {Coordinates of node to be closed.} 
K := 0; 
repeat {The loop trough 4 production rules.} 
K := K + 1; U := X + CX[K]; V := Y + CY[K]; 
if LABCOPY[U, V] = 0 {The cell is free.} 
then begin 
LABCOPY[U,V] := LABCOPY[X,Y] + 1; {New wave’s number.} 
if (U = 1) or (U = M) or (V = 1) or (V = N) {Boarder.} 
then YES := true; {Success. Here BACK(U,V) could be called.} 
else begin {Placing a newly opened node into front’s end.} 
NEWN := NEWN + 1; FX[NEWN] := U; FY[NEWN] := V; 
end; 
end; 
until (K = 4) or YES; {Each of 4 productions is checked or success.} 
CLOSE := CLOSE + 1; {Next node will be closed.} 
until (CLOSE > NEWN) or YES; 
{ 6) Printing the path found.} 
if YES 
then begin 
writeln('A path exists.'); 
BACK(U,V); {Collecting the path.} 
{ Here a procedure should be called to print the path.} 
end 
else writeln('A path does not exist.'); 
end. 
 
[ATTACH]764226[/ATTACH]
Миниатюры
Поиск пути в лабиринте  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2016, 16:56
Ответы с готовыми решениями:

Поиск пути в лабиринте
Создал программу, которая генерирует лабиринт из двумерного массива, где 0 - стенки лабиринта, 1 - проходы, 2 - начало, 3 - конец, 4 -...

Поиск пути в лабиринте
Есть двухмерный массив : 1 - препятствие, 0 - проход. Нужно найти кратчайший путь от одной точки до другой. У меня есть волновой...

Рекурсия (не могу из нее выйти) поиска пути в лабиринте
Добрый день, друзья! Пытаюсь реализовать программу, которая бы находила путь в лабиринте(интовый массив, элемент =5 точка входа,...

2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,990
Записей в блоге: 32
25.11.2016, 03:04
Лучший ответ Сообщение было отмечено kmm96 как решение

Решение

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
#include <iostream>
#include <vector>
 
using namespace std;
 
const int rows = 7, cols = 7;
int a[rows][cols] = {
    1, 1, 1, 1, 1, 0, 1,
    0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 0, 1, 1,
    1, 0, 0, 0, 0, 1, 1,
    1, 0, 1, 0, 0, 0, 1, 
    1, 0, 0, 0, 1, 0, 1, 
    1, 1, 1, 1, 1, 1, 1};
 
typedef struct{int x; int y;} POINT;
typedef vector<POINT> state;
 
bool add_point(POINT& p, state& s) {
    if (p.x<1 || p.x>cols || p.y<1 || p.y>rows) return false;
    if (a[rows-p.y][p.x-1]>0) return false;
 
    for (auto it = s.begin(); it != s.end(); it++)
        if (it->x == p.x && it->y == p.y) return false;
 
    s.push_back(p);
    return true;
}
 
vector<state> steps(state& s) {
    POINT p = s.back();
    vector<state> r;
    for (int dx = -1; dx <= 1; dx++)
        for (int dy = -1; dy <= 1; dy++) {
            if (abs(dx) == abs(dy)) continue;
            POINT pd; pd.x = p.x + dx; pd.y = p.y + dy;
            state sd = s;
            if (add_point(pd, sd)) r.push_back(sd);
        }
    return r;
}
 
bool is_solved(state& s) {
    POINT p = s.back();
    return p.x==1 || p.x==cols || p.y==1 || p.y==rows;
}
 
vector<state> start_state() {
    POINT p; p.x = 5; p.y = 4;
    state s; s.push_back(p);
 
    vector<state> r; r.push_back(s);
    return r;
}
 
vector<state> solve_wide(vector<state> ss) {
    vector<state> r, ns;
    for (auto it = ss.begin(); it != ss.end(); it++) {
        state s = *it;
        if (is_solved(s)) r.push_back(s);
        else {
            vector<state> css = steps(s);
            ns.insert(ns.end(), css.begin(), css.end());
        }
    }
    return !r.empty() ? r : ns.empty() ? ns : solve_wide(ns);
}
 
void show_state(state& s) {
    for (auto it = s.begin(); it != s.end(); it++)
        cout << "(" << it->x << ", " << it->y << ")" << endl;
}
 
int main() {
    vector<state> r = solve_wide(start_state());
    for (int i = 0; i < r.size(); i++) {
        cout << "Variant " << i+1 << ":" << endl;
        show_state(r[i]);
        cout << endl;
    }
    return 0;
}
Variant 1:
(5, 4)
(5, 5)
(5, 6)
(6, 6)
(6, 7)

Variant 2:
(5, 4)
(5, 5)
(5, 6)
(6, 6)
(7, 6)
0
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 10
25.11.2016, 11:43  [ТС]
Это вы свою программу написали или перевели с паскаля?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.11.2016, 11:43
Помогаю со студенческими работами здесь

Алгоритм поиска пути в лабиринте, заданном связным графом
использовать алгоритм поиска пути в лабиринте, заданном связным графом. граф уже задан в самой программе. Пример: int mas = {...

Поиск в лабиринте
Здравствуйте, опять нужна помощь Вообщем задача такая-дан лабиринт, пройти от одной точки к другой, посчитать кол-во ходов, используе...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab () { int s1 = 0; int s2 =...

Поиск пути в лабиринте
В приведенном ниже плане лабиринте буквой А помечен мобильный агент, буквой В выход из лабиринта. Цель агента – выйти из лабиринта. ...

Поиск пути в лабиринте
Помогите, пожалуйста, разработать программу для поиска пути в лабиринте.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru