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

В программе не до конца выполняется цикл while

25.10.2025, 19:49. Показов 1400. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня программа ищет выход из лабиринта. На входе текстовый файл, в котором 0-проход, 1-стена, 2-вход, 3-выход.
Нужно получить выходной файл, в котором 1- путь, остальное-0.
У меня для одного лабиринта выполнилась программа, а для другого (там, где есть тупик) нет. Хотя, я прописала, что делать в этом случае, но программа почему-то не заходит в этот if.
Подскажите, как исправить.
Самое странное, что в цикле внешнем while программа доходит до проблемной точки, а дальше не идет, ничего не печатает.
Мне было бы понятно, если бы зациклилась. А такое поведение не понятно.

Я код в виде архива прикрепила.
Подскажете?
Вложения
Тип файла: rar Labirint_main.rar (17.40 Мб, 14 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2025, 19:49
Ответы с готовыми решениями:

do while - почему выполняется цикл, даже если условие истина?
Подскажите пожалуйста, пишу программу вопрос/ответ. При не правильным вводе ответа, программа...

Неправильно выполняется цикл do while
Есть код: #include <iostream> #include <math.h> using namespace std; int main(){...

Цикл while выполняется два раза подряд
Есть такой код, у меня этот цикл выполняется 2 раза за одно нажатие клавиши, в чем может проблема?...

13
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.10.2025, 20:47
Условие такое в цикле.
Что если одна из координат совпадает с точкой выхода, цикл прерывается.
C++
1
2
3
4
5
6
   int i1 = 1, i2 = 1; // точка входа
   int i1_out = 10, i2_out = 4; // точка выхода
   while ((i1 != i1_out) && (i2 != i2_out)){
      ++i2; // должен быть бесконечный цикл?
   }
   std::cout << i2;
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
25.10.2025, 21:34  [ТС]
Спасибо!
Это поправила, но теперь доходит до следующего тупика и начинает вся время двигаться назад, ко входу, а не к выходу.
Что еще поправить? Где-то забыла статус сменить на passed?
Во вложении поправленный главный файл.
Вложения
Тип файла: rar Labirint_main.rar (1.6 Кб, 11 просмотров)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
25.10.2025, 23:25
Откуда же мне знать?
Я не знаю по каком алгоритму ищется выход в этой программе.

Добавлено через 42 минуты
Похоже на попытку поиска в ширину(ещё называют Волновым методом), только криво.
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
26.10.2025, 01:14  [ТС]
Да, как-то так. Только не вижу, где опять ошибка. За свежим, внимательным взглядом обращаюсь.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2025, 01:41
Цитата Сообщение от Ната87Ната Посмотреть сообщение
Да, как-то так.
То что там есть сейчас, нет особого смысла исправлять.
Просто написать заново без всех этих костылей.
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
26.10.2025, 13:43  [ТС]
Что за костыли? Что так сильно не понравилось то???
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2025, 14:40
Да мне всё нравится.
Просто в коде поиска пути, нет законченной логики. И так же неоднозначностей.
Поэтому править его можно бесконечно.
Навскидку намешена логика поиска в глубину и поиска в ширину, что уже нехорошо.
Есть множество разных состояний, исключительных, что приводит к ещё большей запутанности очень простой задачи.

Цитата Сообщение от Ната87Ната Посмотреть сообщение
доходит до следующего тупика и начинает вся время двигаться назад, ко входу, а не к выходу
Он же не знает где выход, так что будет искать везде.
Почему идет назад? А почему нет? Клетка не всегда удаляется из вектора, как обработанная.
И при след. цикле while, опять будет обрабатывать те же самые клетки.
Нет проверки точки c(которая уже в списке на обработку) на passed.

Из постановки задачи уже неоднозначность:
Цитата Сообщение от Ната87Ната Посмотреть сообщение
Нужно получить выходной файл, в котором 1- путь, остальное-0.
На самом деле путь не будет известен.
Code
1
2
3
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Откуда, куда и по каким клеткам прошел персонаж???
И в реализации/задумке поиска пути такая же ситуация.
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
26.10.2025, 14:52  [ТС]
Но это не совсем граф, чтобы был четко поиск в ширину. А так проверяю 4 соседние клетки (по диагонали сказано нельзя ходить). Стена (1)- не идем, по уже прошедшим тоже не идем (только чтобы из тупика выбраться), а если выбор из двух, то уж первую в векторе из 4-х, что не всегда удачно...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2025, 15:21
Цитата Сообщение от Ната87Ната Посмотреть сообщение
Но это не совсем граф, чтобы был четко поиск в ширину.
Это как раз таки совсем граф.
Каждая вершина адресуется координатами однозначно.
Каждая связь вершины(точки (x,y)) однозначно определяется с другой точкой(связь есть только в случае одинаковой координаты x или y).
Такую систему можно легко воспринимать как граф, что и успешно используется в алгоритме Ли.

И что я успешно могу продемонстрировать сам, просто описав интерфейс графа над полем игры.
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
27.10.2025, 10:56  [ТС]
У меня заработало

Добавлено через 1 минуту
Там ошибка была в том, что перепутала размеры по х и у в функции проверки на то, что не вышли за границы лабиринта.
0
1 / 1 / 0
Регистрация: 22.01.2018
Сообщений: 176
27.10.2025, 11:31  [ТС]
Правда во все тупики заходит, но благо возвращается на нужный путь, и еще топтаться на свободном пространстве любит
Миниатюры
В программе не до конца выполняется цикл while   В программе не до конца выполняется цикл while  
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
27.10.2025, 12:10
Создаешь таблицу. 1 - стены, 2 - вход (старт), 3 - выход (финиш). Остальные нули.

- Ищешь клетку со входом (2), проверяешь соседние клетки - и если в них 0 - записываешь в них, ну скажем, 11.
- Ищешь клетки с 11, проверяешь соседние, если в них 0 - записываешь 12
- И так далее, пока не дойдешь до выхода (3) - путь найден, или пока не возникнет такая ситуация, что не удастся поставить ни одной следующей цифры - путь не найден.

Потом нужно найти реальный кратчайший путь от 3 к 2. Допустим, цифра 3 нашлась после 15, записываешь в ячейку 15 (например) 115. Находим вокруг 115 точку 14 - если их несколько, выбираешь первую попавшуюся или рэндомом. Записываешь в точку 14 - 114. И так далее до 111, которая и будет граничить с входом 2. Потом проходишь по таблице и вместо всех 2-х значных чисел возвращаешь нули. А оставшиеся 3-х значные 111, 112, 113, 114 и 115 и будут путем от входа 2 к выходу 3.

Как то так.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.10.2025, 12:56
alexu_007, это и есть Алгоритм Ли/Волновой метод/Волновая трассировка.
Цитата Сообщение от Ната87Ната Посмотреть сообщение
У меня заработало
Молодец.

Добавлено через 6 минут
Цитата Сообщение от Ната87Ната Посмотреть сообщение
Правда во все тупики заходит
Проверь на поле 100*100 без стен.

Цитата Сообщение от Ната87Ната Посмотреть сообщение
перепутала размеры по х и у
Поэтому поводу есть совет.
X - это ширина(координата по горизонтали), Y - высота(по вертикали). Так устоялось по декартовой системе координат.
Когда используешь переменные для массива, всегда используется наоборот.
Что бы меньше путать, называть переменные для массива h и w(r/c, row/col), или аналогично.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2025, 12:56
Помогаю со студенческими работами здесь

Цикл while: найти наибольшее целое число K, при котором выполняется неравенство 3^K<N
Помогите, пожалуйста создать программку через (while). Дано целое число N(N&gt;1). Найти наибольшее...

что такое цикл while и Do-while
Никак не могу понять вообще,объясните по русски.спасибо

Нужно переписать во вложенной л/р цикл while на do while и for
Ребят, нужна помощь студенту-разгильдяю 1-го курса КПИ. Нужно переписать во вложенной лабе цыкл...

Цикл while (обновлять while если имеется 2 обновляющих значения)
while(a==0){ if(a==0){ st.push(k); st1.push(l+1);}.. Как сделать так, что бы обновлять while...

Почему не работает цикл while для заполнения и do while для вывода массива?
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru