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

Разработать программу, находящую путь из начальной точки в конечную

04.06.2017, 23:32. Показов 1927. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
текстовом файле задается прямоугольное поле:

· Пробел - свободное место;
· Символ 'X' - препятствие;
· Символ 'S' - точка начала движения;
· Символ 'F' - точка завершения движения;

Требуется разработать программу, находящую путь из начальной точки в конечную и формирующую файл, аналогичный исходному, но с указанием символом '+' найденного пути.
Проход по диагонали разрешается.
Сделать минимум 5 тестовых наборов(unit test) с различным набором файлов. Размерность каждой таблицы не менее чем 10х10.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2017, 23:32
Ответы с готовыми решениями:

Рекурсия: число различных путей для насекомого из начальной точки поля в конечную
Снова нужна помощь специалистов Представь насекомое на клечатом поле размера M x N . Насекомое стартует из нижнего левого угла (0,...

Разработать программу для преобразования чисел с фиксированной точкой исходной системы счисления в конечную.
Разработать программу для преобразования чисел с фиксированной точкой исходной системы счисления в конечную. Очень нужно

Реализовать алгоритм А* для поиска оптимального пути из начальной вершины в конечную на графе
Привет Нужно реализовать этот алгоритм для поиска оптимального пути из начальной вершины в конечную на графе. Смотрю на пример....

2
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
05.06.2017, 12:17
Лучший ответ Сообщение было отмечено aeaeaeae как решение

Решение

По простому
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
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <queue>
typedef std::vector<char>::size_type stype;
 
struct point {
    stype x, y;
    point(void){}
    point(stype _x, stype _y):x(_x), y(_y){}
 
    bool operator == (const point& p) const {
        return ((x == p.x) && (y == p.y));
    }
 
    bool operator != (const point& p) const {
        return !(*this == p);
    }
};
 
void maze_findpath(std::ostream& _out, std::istream& _in);
bool path_find(std::vector<std::vector<char> >& mat);
 
int main(void){
    char s[] =
    "5 7\n"\
    "      X\n"\
    "SX  XXX\n"\
    " X XX F\n"\
    "    X  \n"\
    " XX   X";
    std::istringstream sp(s);
    maze_findpath(std::cout, sp);
 
/*  файловый ввод и вывод
    std::ifstream fin("input.txt");
    std::ofstream fout("output.txt");
    maze_findpath(fout, fin);
    fin.close();
    fout.close();
*/
    std::cin.get();
    return 0;
}
 
//формат: на первой строке кол-во строк и кол-во столбцов далее матрица
void maze_findpath(std::ostream& _out, std::istream& _in){
    int N, M;
    if(!(_in >> N >> M) || (N <= 0) || (M <= 0))
        return;
    _in.get();
 
    std::vector<std::vector<char> > mat(N);
    char c;
    for(int i = 0; (i < N) && !_in.fail(); ++i){
        mat[i].resize(M);
        for(int j = 0; (j < M) && _in.get(c); ++j)
            mat[i][j] = c;
 
        if(_in.eof())
            break;
        _in.get();
    }
 
    //найти путь
    if(path_find(mat)){
        //вывести
        for(stype i = 0; i < mat.size(); ++i){
            for(stype j = 0; j < mat[i].size(); ++j)
                _out << mat[i][j] << ' ';
            _out << std::endl;
        }
    } else
        _out << "Путь не найден!" << std::endl;
 
    for(stype r = 0; r < mat.size(); ++r)
        mat[r].clear();
    mat.clear();
}
 
//нахождение пути
bool path_find(std::vector<std::vector<char> >& mat){
    const int dirs[8][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}, {1,1}, {-1,1}, {1,-1}, {-1,-1}};
    point cur, start, end;
    const stype rows = mat.size();
    const stype cols = (rows > 0) ? mat[0].size() : 0;
    bool  ok = false;
 
    std::vector<std::vector<short> > visit(rows, std::vector<short>(cols, 0x7FFF));
    std::vector<std::vector<point> > parent(rows, std::vector<point>(cols));
 
    //находим начальную и конечную точку
    for(stype i = 0; i < rows; ++i){
        for(stype j = 0; j < cols; ++j){
            switch(mat[i][j]){
            case 'S':
                start.x = j;
                start.y = i;
                mat[i][j] = ' ';
                break;
            case 'F':
                end.x   = j;
                end.y   = i;
                mat[i][j] = ' ';
                break;
            }
        }
    }
 
    std::queue<point> qs;
    visit[start.y][start.x] = 0;
    qs.push(start);
 
    while(! qs.empty()){
        cur = qs.front();
        qs.pop();
        if(cur == end){
            ok = true;
            break;
        }
 
        for(stype i = 0; i < 8; ++i){
            stype x = cur.x + dirs[i][0];
            stype y = cur.y + dirs[i][1];
            if((x < 0) || (y < 0) || (x >= cols) || (y >= rows) || (mat[y][x] == 'X'))
                continue;
 
            if(visit[y][x] > (visit[cur.y][cur.x] + 1)){
                parent[y][x] = cur;
                visit[y][x]  = visit[cur.y][cur.x] + 1;
                qs.push(point(x, y));
            }
        }
    }
 
    if(ok){
        mat[end.y][end.x] = '+';
        while(start != end){
            end = parent[end.y][end.x];
            mat[end.y][end.x] = '+';
        }
    }
 
    for(stype r = 0; r < visit.size(); ++r){
        visit[r].clear();
        parent[r].clear();
    }
    parent.clear();
    visit.clear();
    return ok;
}
1
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 219
05.06.2017, 14:44  [ТС]
Спасибо большое а скажите пажалуйста как сделать unit test для данной программы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2017, 14:44
Помогаю со студенческими работами здесь

Определить кратчайший путь от начальной вершины к конечной
определить кратчайший путь от начальной вершины к конечной. заполнить ленточную матрицу шириной 3, нормальное распределение. у меня 8...

Разработать иерархию не менее 2 классов, и программу Разработать программу для реализации игры пятнашки. Разработать 2-3
Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы...

поворот вокруг начальной точки на угол
Не могу найти рабочую формулу. Координаты должны быть целыми значениями. Такое не работает Sinus = Sin(Angle); Cosinus =...

Разработать программу для определения принадлежности точки графику функции
Точка плоскости с координатами x, y принадлежит графику функции y=x^3+0.5x+5.6 . Результат работы программы – сообщение о...

Разработать разветвляющуюся программу определения места нахождения на плоскости точки
используя технологию структурного программирования разработать разветвляющуюся программу для решения индивидуальной задачи определения...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru