powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Логическая ошибка в простом алгоритме поиска кратчайшего пути.
20 сообщений из 45, страница 2 из 2
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455400
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

я уже мозгами плыву ...там верняк все верно, это ж логично ...
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455402
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111,
если не можешь в уме, подставь циферки в условие (у ракеты координаты 1,1 и у цели 1, 10) и на бумажке просчитай.
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455405
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

да между точками поезд проедит ... на пересечении 1:1 и 1:10 там такая вертикальная палка вверх идет на 10 пунктов
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455410
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111,
вертикальная палка вверх идетв том и дело что не идет. Какой результат вычисления выражения
Код: java
1.
(1 != 1) && (1 != 10)
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455415
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

ага, то есть первое условие дает 1 != 1 будет фолс 1 != 10 будет тру (фолс И труе) будет фалс и конец тут или я мозгами плыву уже ... или хз что, но как теперь исправить это ?
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455419
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111,
как теперь исправить это ? Ну как, если вносить самый минимум исправлений, то нужно сказать: Я хочу чтобы цикл выполнялся пока хотя бы одна координата цели (х или у) отличается от соответствующей координаты ракеты. А сейчас у тебя написано так: Я хочу чтобы цикл выполнялся пока обе координаты цели отличаются от соответствующей координаты ракеты.
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455421
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

а можешь кодом, я уже на логику ничего не понимаю в 12 ночи ...
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455422
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает. Исправил 2-е ошибки + легкий рефакторинг.
С точки зрения Java, код конечно ужасный, но из чего лепили, то и получили

1. INT --> double
2. while((xRaketa != xTarget) && (yRaketa != yTarget))
заменил на
||
иначе ракета не достигала цели.

Легкий рефакторинг
1. Убрал все static'и. Можно еще и убрать все public'и )))
2. Из main все вынес в метод flight() и initAndFlight()
3. Вычисление расстояния сделал в методе tryDirection. В принципе, излишество /когда выносил в метод, не думал, что простыню if... сделаю циклом ))) /
4. Простыню if... сделал циклом. Т.к. было лень 8 вызовов tryDirection писать )))


Код: java
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.
package fignya;

    public class Task 
    {
            final static int size = 50;
            char [][] field = new char[size][size];
            int xRaketa;
            int yRaketa;
            int xTarget;
            int yTarget;
            
            public static void main(String[] args)
            {
                Task my = new Task();
                // Из точки 1,1 в точку 35,35
                my.initAndFlight( 1,1, 35, 35 );
                // В обратном направлении
                my.initAndFlight( 35, 35, 1,1  );
                // Это не ФОБОС, т.ч. и так летает
                my.initAndFlight( 5, 40, 30, 10  );
            }
            
            public void initAndFlight( int xRaketa, int yRaketa, int xTarget, int yTarget ) {
                fillArray();

                this.xRaketa = xRaketa;
                this.yRaketa = yRaketa;
                this.xTarget = xTarget;
                this.yTarget = yTarget;

                field[xRaketa][yRaketa] = 'R';
                field[xTarget][yTarget] = 'T';
                
                System.out.println( "" );
                System.out.println( "          ROS-KOSMOS - FOREVE !!!" );
                System.out.println( "" );
                System.out.println("Raketa" + " " + xRaketa + " " + yRaketa);
                System.out.println("Target" + " " + xTarget + " " + yTarget);
                System.out.println( "" );
                
                flight();
            }
            public void flight() {
                while(( xRaketa != xTarget) || (yRaketa != yTarget)) {
                  goTarget();
                  printArray();
                  System.out.println( xRaketa + " " + yRaketa + " " + xTarget + " " + yTarget );
                }
            }

    class offset_t {
                public int dx;
                public int dy;
                public double d;
                public void set( offset_t new_val ) {
                    dx = new_val.dx;
                    dy = new_val.dy;
                    d = new_val.d;
                }
            };
            
            /* Функция расчитывает перемещение в заданном направлении. Возврашает true если направление перемещение лучше, чем предыдущее */
            public boolean tryDirection( offset_t direction, double min_d ) {
                direction.d = Math.sqrt(Math.pow(( xRaketa + direction.dx - xTarget  ),2) + Math.pow(( yRaketa + direction.dy - yTarget ),2));
                if ( direction.d < min_d ) {
                    return true;
                }
                return false;
            }
            
            public void goTarget() {
                // best - лучшее направление
                // current - текущее (последнее тестировавшиеся направление)
                offset_t best, current;
                best = new offset_t();
                current = new offset_t();
                
                // Некое большое число )))
                best.d = size * size * 2;
                // Находим наилучшее расстояние для движения
                int dx, dy;
                for ( dx = -1; dx <= 1; dx++ ) {
                    for ( dy = -1; dy <= 1; dy++ ) {
                        // Ситуацию, когда стоим на месте просчитывать не нужно, хотя и можно )))
                        // Если стоять на месте самое выгодное, скорее всего, мы догнали цель. IMHO
                        if ( dx==0 && dy==0 ) {
                           continue;
                        }
                        current.dx = dx;
                        current.dy = dy;
                        if ( tryDirection( current, best.d ) ) {
                            best.set( current );
                        }
                    }
                }
                //
                xRaketa = xRaketa + best.dx;
                yRaketa = yRaketa + best.dy;
                //
                field [ xRaketa ] [ yRaketa ] = '*';
            }
            
            public void setRaketaAndTarget() {
                    xRaketa = 1;
                    yRaketa = 1;
                    field[xRaketa][yRaketa] = 'R';
//                    xTarget = (int)(Math.random() * 25);
//                    yTarget = (int)(Math.random() * 25);
                    xTarget = (int)35;
                    yTarget = (int)35;
                    
                    field[xTarget][yTarget] = 'T';
            }
            
            public void fillArray() {
                    for(int i = 0; i < field.length; i++) {
                            for(int j = 0; j < field.length; j++) {
                                    field[i][j] = '-';
                            }
                    }
            }
            
            public void printArray() {
                    for(int i = 0; i < field.length; i++) {
                            for(int j = 0; j < field.length; j++) {
                                    System.out.print(field[i][j] + " ");
                            }
                            System.out.println();
                    }
                    System.out.println();
            }
    }
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455425
botasa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

спасибо, иду спать, может повезет мне присниться что то по круче =) а код уже с утра разберу
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455426
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111,а можешь кодом, я уже на логику ничего не понимаю в 12 ночи ...Ну теперь куда денусь)Leonid Kudryavtsev 2. while((xRaketa != xTarget) && (yRaketa != yTarget))
заменил на
||
иначе ракета не достигала цели.
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455427
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
botasa111а я пытался именно на моем пример, я ставил ИНТ и ДАБЛ результат тотже ...

Пример где Дабл и результат тот же.

У меня с даблом - летает. С первого раза. Рефакторинг на алгоритм сказаться не должен (если только у тебя в простыне if... нет очепяток, что, при таком количестве if, сделать не сложно).
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455429
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
у вас очень серьезная ошибка в коде
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455436
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerу вас очень серьезная ошибка в коде
Возможно. А где?

Еще раз глазами пробежался, не заметил. (были опечатка, что я dx и dy перепутал. Но это при первом же запуске выплыло)
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455438
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
в этой строке) System.out.println( " ROS-KOSMOS - FOREVE !!!" );
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455444
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это была дань уважения Лагман'у. Он первый в данной ветки ответил )))
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455541
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Только на 2-- и помахать ручкой (кто кому индепенд от универа). Задача напомнила учебники по языку ЛОГО,

independ - независимо
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455544
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот она - моЩЬ JAVA!
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38455628
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
while(( xRaketa != xTarget) || (yRaketa != yTarget))


А кто это придумал числа с плавающей точкой на равенство сравнивать?
Про матанализ и эпсилон не слышали?
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38456326
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID,
они были интами сначала
...
Рейтинг: 0 / 0
Логическая ошибка в простом алгоритме поиска кратчайшего пути.
    #38456329
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID,
и остались
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Логическая ошибка в простом алгоритме поиска кратчайшего пути.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]