12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27

Из массива считывается какая-то чушь

28.08.2017, 09:39. Показов 623. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил освежить в памяти С++. Пишу простенькую программу поиска пути(поле из квадратных ячеек. переход только на одну из 4 соседних. каждой ячейке присвоено значение показывающее сколько условных единиц времени нужно, чтобы перейти на эту ячейку с любой соседней ячейки).
Задачу постепенно усложняю. Изначально поставил цель выяснить минимальное время на перемещение из начальной ячейки в каждую ячейку поля. Проблем не возникло(точнее возникли, но ошибки смог найти сам). Теперь задача проложить кратчайший путь из начальной ячейки в конечную и указать ячейку до которой по этому пути можно добраться за заданное количество единиц времени.
Делаю через построение массива из первого варианта задачи и возвратом из конечной точки.

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
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
 
int Map[12][12];//Массив содержащий данные о поле, по которому происходит построение пути.
 
class Point//Класс для удобства передачи координат из функции
{
      public:
             int X;
             int Y;
      private:
};
 
void ReadMap()//чтение данных из файла
{
     ifstream MapFile;
     MapFile.open("map.txt");
     int X;
     int Y;
     for(Y = 0; Y < 12; Y++)
     {
           for(X = 0; X < 12; X++)
           {
                 MapFile >> Map[X][Y];
           }
     }
     MapFile.close();
}
 
//основные действия производятся в этой функции.
//на входе координаты начальной ячейки, координаты конечной ячейки и условная скорость перемещения
Point WalkTo(int StartX, int StartY, int FinX, int FinY, int Speed)
{
    int X;
    int Y;
    int Path[12][12];//массив, в котором будут данные о времени необходимом на движение до каждой из ячеек
    for(Y = 0; Y < 12; Y++)//забиваем массив нулями
    {
          for(X = 0; X < 12; X++)
          {
                Path[X][Y] = 0;
          }
    }
    Path[StartX][StartY] = Map[StartX][StartY];//ставим начальную точку
    bool NoChange = false;
//суть цикла - забег по массиву.
//Если ячейка не нулевая, проверяется не является ли она более оптимальным путём в каждую из соседних ячеек.
//Если является, время в соседней изменяется на более оптимальное, и отмечается, что на этом проходе массива были внесены изменения.
//если изменений внесено не было, значит во всех ячейка стоит минимальное время, за которое можно до них добраться.
    while(not(NoChange))
    {
          NoChange = true;
          for(Y = 1; Y < 11; Y++)
          {
                for(X = 1; X < 11; X++)
                {
                      if(not(Path[X][Y]==0))
                      {
                           if((Path[X+1][Y]==0)or(Path[X+1][Y]>(Path[X][Y]+Map[X+1][Y])))
                           {
                                 NoChange = false;
                                 Path[X+1][Y] = Path[X][Y] + Map[X+1][Y];
                           }
                           if((Path[X-1][Y]==0)or(Path[X-1][Y]>(Path[X][Y]+Map[X-1][Y])))
                           {
                                 NoChange = false;
                                 Path[X-1][Y] = Path[X][Y] + Map[X-1][Y];
                           }
                           if((Path[X][Y+1]==0)or(Path[X][Y+1]>(Path[X][Y]+Map[X][Y+1])))
                           {
                                 NoChange = false;
                                 Path[X][Y+1] = Path[X][Y] + Map[X][Y+1];
                           }
                           if((Path[X][Y-1]==0)or(Path[X][Y-1]>(Path[X][Y]+Map[X][Y-1])))
                           {
                                 NoChange = false;
                                 Path[X][Y-1] = Path[X][Y] + Map[X][Y-1];
                           }
                      }
                }
          }
    }
    for(Y = 0; Y < 12; Y++)//рисуем результат, для упрощения дальнейшего анализа
    {
          for(X = 0; X < 12; X++)
                cout << Path[X][Y] << " ";
          cout << endl;
    }
    X = FinX;
    Y = FinY;
//становимся в конечную ячейку, смотрим, как мы сюда попали, возвращаемся
// последние два пункта повторяются, пока не окажемся в ячейке, путь до которой укладывается в заданное время.
    while(Path[X][Y] > Speed)
    {
         if((Path[X][Y] = Path[X - 1][Y] + Map[X][Y])and(X > 1))
         {
//в целях анализа выводим параметры сделанного выбора.
//Время до текущей ячейки, время до ячейки, из которой мы пришли в текущую ячейку, и время на этот переход.
//в последующих if'ах всё идентично.
               cout << Path[X][Y] << " " << Path[X - 1][Y] << " " << Map[X][Y] << endl;
               X = X - 1;
         }
         else if((Path[X][Y] = Path[X + 1][Y] + Map[X][Y])and(X < 12))
         {
               cout << Path[X][Y] << " " << Path[X + 1][Y] << " " << Map[X][Y] << endl;
               X = X + 1;
         }
         else if((Path[X][Y] = Path[X][Y - 1] + Map[X][Y])and(Y > 1))
         {
               cout << Path[X][Y] << " " << Path[X][Y - 1] << " " << Map[X][Y] << endl;
               Y = Y - 1;
         }
         else if((Path[X][Y] = Path[X][Y + 1] + Map[X][Y])and(Y < 12))
         {
               cout << Path[X][Y] << " " << Path[X][Y + 1] << " " << Map[X][Y] << endl;
               Y = Y + 1;
         }
//отображение пути возвращения.
         cout << X << " " << Y << endl;
         system("PAUSE");
    }
    Point Location;
    Location.X = X;
    Location.Y = Y;
    return(Location);
}
 
int main(int argc, char *argv[])
{
    ReadMap();
    int StartX;
    cin >> StartX;
    int StartY;
    cin >> StartY;
    int FinX;
    cin >> FinX;
    int FinY;
    cin >> FinY;
    int Speed;
    cin >> Speed;
    Point Location = WalkTo(StartX,StartY,FinX,FinY,Speed);
    cout << Location.X << " " << Location.Y;
    system("PAUSE");
    return EXIT_SUCCESS;
}
На выходе имеем:
2
2
9
9
10
0 5 5 7 9 11 13 15 17 19 21 0
5 3 2 3 4 5 6 7 8 9 10 11
5 2 1 11 14 15 16 17 18 19 11 12
7 3 11 12 13 14 15 15 14 13 12 13
18 13 12 13 14 15 16 16 15 14 13 14
20 14 13 14 15 16 17 17 16 15 14 15
22 15 14 15 16 17 18 18 17 16 15 16
24 16 15 16 17 18 19 19 18 17 16 17
26 17 16 17 18 19 20 20 19 18 17 18
28 18 17 18 19 20 21 21 20 19 18 19
30 19 18 19 20 21 22 22 21 20 19 20
0 20 19 20 21 22 23 23 22 21 20 0
21 20 1
8 9
Для продолжения нажмите любую клавишу . . .
22 21 1
7 9
Для продолжения нажмите любую клавишу . . .
22 21 1
6 9
Для продолжения нажмите любую клавишу . . .
21 20 1
5 9
Для продолжения нажмите любую клавишу . . .
20 19 1
4 9
Для продолжения нажмите любую клавишу . . .
19 18 1
3 9
Для продолжения нажмите любую клавишу . . .
18 17 1
2 9
Для продолжения нажмите любую клавишу . . .
19 18 1
1 9
Для продолжения нажмите любую клавишу . . .
20 19 1
2 9
Для продолжения нажмите любую клавишу . . .
Координаты начальной ячейки (2;2)
Координаты конечной (9;9)
Скорость 10
удобный для восприятия вид карты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
1   2   3   4   5   6   7   8   9   10  11  12
2   1   1   1   1   1   1   1   1   1   1   1
3   1   1   10  10  10  10  10  10  10  1   1
4   1   10  1   1   1   1   1   1   1   1   1
5   10  1   1   1   1   1   1   1   1   1   1
6   1   1   1   1   1   1   1   1   1   1   1
7   1   1   1   1   1   1   1   1   1   1   1
8   1   1   1   1   1   1   1   1   1   1   1
9   1   1   1   1   1   1   1   1   1   1   1
10  1   1   1   1   1   1   1   1   1   1   1
11  1   1   1   1   1   1   1   1   1   1   1
12  1   1   1   1   1   1   1   1   1   1   1
Массив путей строится корректно.
Но, когда начинается движение, сразу видно, что творится какая-то непонятная ерунда:
Зничение Path[9][9] по отрисованной таблице 19
Зничение Path[8][9] по отрисованной таблице 20
По идее, он должен проверить 19=20+1 понять, что это не так и уйти на else со следующим if
Вместо этого, он как-то получает Path[9][9] равный 21. 21=20+1 и движение пошло в другую сторону.
В дальнейшем из Path считывается какая-то чушь.
Вложения
Тип файла: txt map.txt (445 байт, 2 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.08.2017, 09:39
Ответы с готовыми решениями:

какая то чушь распечатывается
// должно распечататся 4 98 89 23 43 9 а получаются...

какая-то чушь с классами. Нужен совет
import java.lang.String; import java.util.Scanner; public class Building{ public String fastBuild(String Quality,String...

Не считывается из в параметризованного динамического массива
Есть массив _desk. Записываю туда мои объекты (производные от класса Piece). Point - это просто структура с координатами ячейки...

2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
28.08.2017, 10:38
Цитата Сообщение от Аракчи Посмотреть сообщение
По идее, он должен проверить 19=20+1 понять, что это не так и уйти на else со следующим if
Вместо этого, он как-то получает Path[9][9] равный 21. 21=20+1 и движение пошло в другую сторону.
Тогда почему здесь:
Цитата Сообщение от Аракчи Посмотреть сообщение
C++
1
(Path[X][Y] = Path[X - 1][Y] + Map[X][Y])
и далее - присваивание, а не сравнение? Ты же сам перезаписываешь элементы.
И условие проверки (X > 1) (и аналогичные далее) лучше первым поставить.
2
12 / 5 / 5
Регистрация: 01.02.2016
Сообщений: 27
28.08.2017, 11:45  [ТС]
Спасибо.
Совсем забыл)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2017, 11:45
Помогаю со студенческими работами здесь

Сформировать двумерный массив по следующему правилу: количество строк массива считывается с 2 позиции 3 строки
№ 21. Дан текстовой файл, сформированный по следующему правилу: первые две строки содержат текстовую информацию, 3-я и 4-я строка содержат...

Из файла считывается только одна строка (в процедуре max происходит выход за границы массива)
Хелп, дорогие форумчане! Проблема: прога по-хорошему считывает из файла только одну строку Проще говоря, если в файле одна строка -...

HP 2550 печатает чушь.
Доброго времени суток всем. Нужна помощь - есть домен контроллер на Windows Server 2008 x64, есть принтер HP 2550n, нужно соответственно...

RichTextBox и ReadAllText открывают чушь
Как дополнение вопрос: my_VarRichTextBox.Text = System.IO.File.ReadAllText(&quot;C:\\Users\\1\\Desktop\\Энергия электрона.rtf&quot;,...

Groovy Сервлеты, Томкат, и прочая чушь=)
Всем привет, после того как я плотно поработал несколько лет на PHP, сделал перерыв и открыл свой клуб активного отдыха=)) Развиваю клуб,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru