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

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

24.11.2016, 16:56. Показов 5613. Ответов 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,991
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru