Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 2

Создать программу, отыскивающую проход по лабиринту.

09.04.2020, 21:17. Показов 2581. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квадрат определяется его координатами в матрице.

Программа находит проход через лабиринт, двигаясь от заданного входа. После отыскания прохода программа выводит найденный путь в виде координат квадратов. Для хранения пути использовать стек.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2020, 21:17
Ответы с готовыми решениями:

Составить программу, отыскивающую проход по лабиринту
Составить программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящий из квадратов. Каждый квадрат...

Создание программы, отыскивающей проход по лабиринту
Создать программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо...

Создать программу, отыскивающую проход по лабиринту
Создать программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо...

1
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
10.04.2020, 15:24
Лучший ответ Сообщение было отмечено Yesimkhan как решение

Решение

Yesimkhan, детская задачка, что тут может быть сложного?
А вообще стек тут никак не уперся, делать надо через очередь
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
using System;
using System.Collections.Generic;
using System.Linq;
 
class Point
{
    public readonly int Y;
    public readonly int X;
 
    public Point(int y, int x)
    {
        Y = y;
        X = x;
    }
 
    public static bool operator ==(Point ob1, Point ob2)
    {
        return ob1.Y == ob2.Y && ob1.X == ob2.X;
    }
 
    public static bool operator !=(Point ob1, Point ob2)
    {
        return false;
    }
}
 
class Program
{
    enum Route { Top, Left, Bottom, Right };
    const char WALL = 'X', PATH = ' ';
    static char[,] arr;
 
    static void Main()
    {
        Random random = new Random();
        arr = new char[5, 6];
        List<Stack<Point>> lst;
        do
        {
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    arr[i, j] = random.Next(3) == 0 ? WALL : PATH;
                }
            }
            // Левый-верхний и правый-нижний углы - вход и выход
            arr[0, 0] = arr[arr.GetLength(0) - 1, arr.GetLength(1) - 1] = PATH;
        } while ((lst = AllPath()).Count == 0);
 
        foreach (var stack in lst)
        {
            PrintArr();
            Console.ForegroundColor = ConsoleColor.Red;
            int saveY = Console.CursorTop;
            foreach (var point in stack.Reverse())
            {
                Console.SetCursorPosition(point.X, point.Y + saveY - arr.GetLength(0) - 1);
                Console.Write('*');
                System.Threading.Thread.Sleep(300);
            }
            Console.ResetColor();
            Console.CursorTop = saveY;
            Console.WriteLine();
        }
 
        Console.ReadKey();
    }
 
    static void PrintArr()
    {
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int j = 0; j < arr.GetLength(1); j++)
            {
                Console.Write(arr[i, j]);
            }
            Console.WriteLine('|');
        }
        for (int i = 0; i <= arr.GetLength(0); i++)
            Console.Write('-');
        Console.WriteLine();
    }
 
    static List<Stack<Point>> AllPath()
    {
        List<Stack<Point>> lst = new List<Stack<Point>>();
        Stack<Point> st = new Stack<Point>();
        st.Push(new Point(0, 0));
        Foo(st, Route.Left);
        return lst;
 
        void Foo(Stack<Point> stack, Route route)
        {
            Point point = stack.Peek();
            if (point.Y == arr.GetLength(0) - 1 && point.X == arr.GetLength(1) - 1)
            {
                lst.Add(stack);
                return;
            }
 
            if (route != Route.Top && point.Y > 0 && arr[point.Y - 1, point.X] != WALL && CheckMove(stack, new Point(point.Y - 1, point.X)))
            {
                Stack<Point> newStack = new Stack<Point>(stack.Reverse());
                newStack.Push(new Point(point.Y - 1, point.X));
                Foo(newStack, Route.Bottom);
            }
 
            if (route != Route.Left && point.X > 0 && arr[point.Y, point.X - 1] != WALL && CheckMove(stack, new Point(point.Y, point.X - 1)))
            {
                Stack<Point> newStack = new Stack<Point>(stack.Reverse());
                newStack.Push(new Point(point.Y, point.X - 1));
                Foo(newStack, Route.Right);
            }
 
            if (route != Route.Bottom && point.Y < arr.GetLength(0) - 1 && arr[point.Y + 1, point.X] != WALL && CheckMove(stack, new Point(point.Y + 1, point.X)))
            {
                Stack<Point> newStack = new Stack<Point>(stack.Reverse());
                newStack.Push(new Point(point.Y + 1, point.X));
                Foo(newStack, Route.Top);
            }
 
            if (route != Route.Right && point.X < arr.GetLength(1) - 1 && arr[point.Y, point.X + 1] != WALL && CheckMove(stack, new Point(point.Y, point.X + 1)))
            {
                Stack<Point> newStack = new Stack<Point>(stack.Reverse());
                newStack.Push(new Point(point.Y, point.X + 1));
                Foo(newStack, Route.Left);
            }
        }
    }
 
    static bool CheckMove(Stack<Point> stack, Point point)
    {
        foreach (var currentPoint in stack)
        {
            if (currentPoint == point)
                return false;
        }
        return true;
    }
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2020, 15:24
Помогаю со студенческими работами здесь

Создать программу, отыскивающую проход по лабиринту
Создать программу на СИ, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат...

Программу, отыскивающую проход по лабиринту
Написать программу, отыскивающую проход по лабиринту, с ис-пользованием контейнерного класса stack из STL. Лабиринт пред-ставляется в виде...

Проход по лабиринту
Описать класс, реализующий стек. Написать программу, использующую этот класс для отыскания прохода по лабиринту. Лабиринт...

Проход по лабиринту
Привет всем. Помогите пожалуйста с задачей на С/C++ идёт практика я не понимаю как сделать задачу просто даже не представляю училка...

Нужно создать программу отыскивающею короткий путь по лабиринту в двумерном массиве
Нужно создать программу отыскивающею короткий путь по лабиринту. Лабиринт представлен в виде квадрата(двумерного массива) из 0 и 1. Ход по...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru