Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73

Разноцветный поезд. Правильный ли алгоритм?

26.02.2017, 15:04. Показов 1918. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мой версия алгоритма ниже. (известно, что он не всегда работает)
В городе готовится к открытию новая линия метро. Платформы станций на ней будут значительно длиннее стандартных. По задумке градоначальника первым по линии должен проехать торжественный разноцветный поезд. Поэтому глава города передал работникам вагонного депо схему окраски вагонов в порядке от головы состава.

На двух запасных путях в депо уже стоит необходимое количество вагонов. Каждый из них окрашен в один из цветов. Цвет обозначается натуральным числом, не превосходящим 1 000 000. Справа находятся два запасных пути, на каждом из которых слева направо расположены вагоны. Работники депо могут за одну операцию прицепить в хвост поезда либо самый левый из находящихся на первом пути вагонов (если такие есть), либо самый левый из находящихся на втором пути. Они повторяют эту операцию до тех пор, пока ни на одном из запасных путей не останется вагонов.
_________________<--- 1, 2, 1, 3
1,  1,  2,  4,  2,  1,  3,  1
_________________<--- 1, 4, 2 ,1
И естественно, у работников депо возник вопрос, можно ли построить описанным выше образом поезд, соответствующий цветовой схеме, которую им передал градоначальник. В примере мы можем получить поезд 1,  1,  2,  4,  2,  1,  3,  1 или поезд вида 1,  2,  1,  1,  4,  2,  1,  3, но не можем получить поезд вида 1,  2,  1,  2,  1,  2,  3,  4 или поезд вида 1,  1,  1,  2,  1,  2,  3,  4.
Мой алгоритм:
1)заносим в 3 стека отдельно требуемый поезд(1) и два маленьких поезда(2) и (3)
пока (1) не пустой
2)берем голову из каждого стека и если:
if_____2а)голова(1) равна голове (2) и равна голове (3), тогда берем следующие элементы(т.е. которые после головы) из каждого стека и:
________если элемент после головы (1) равен эл-у после головы (2), то тогда удалили головы (1) и (2) иначе
________если элемент после головы (1) равен эл-у после головы (3), то тогда удалили головы (1) и (3)
________иначе удалили головы (1) и (2)(можно и 1 и 3, т.е. не важно)
else 2б)голова(1) равна голове (2) и не равна голове (3), тогда удалили головы (1) и (2)
else 2в)голова(1) равна голове (3) и не равна голове (2), тогда удалили головы (1) и (3)
else если ничего из вышеперечисленного не произошло, тогда поезд составить нельзя, а если мы в это else не попали, то поезд составить можно
Кому не лень, код:
mainTrain - 1 стек
train1, train2 2 и 3 стеки
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
boolean isPossible = true;
        Long tr1, tr2, tr3, tr1Peek, tr2Peek, tr3Peek;
        while(mainTrain.size() != 0) {
           if(train1.size() != 0) tr1 = train1.pop();
               else tr1 = -1L;
           if(train2.size() != 0) tr2 = train2.pop(); 
               else tr2 = -1L;
           tr3 = mainTrain.pop();
           if(train1.size() != 0) 
               tr1Peek = train1.peek(); 
           else tr1Peek = -1L;
           if(train2.size() != 0) 
               tr2Peek = train2.peek();
           else tr2Peek = -1L;
           if(mainTrain.size() != 0) 
               tr3Peek = mainTrain.peek(); 
           else tr3Peek = -1L;
           //-------
           if(tr1 == tr3 && tr2 == tr3) {
               if(tr1Peek == tr3Peek) { 
                   train2.push(tr2); } 
               else
               if(tr2Peek == tr3Peek) { 
                   train1.push(tr1); } 
               else train2.push(tr2);
           } else
           if(tr1 == tr3) {
               train2.push(tr2); } else
           if(tr2 == tr3) { 
               train1.push(tr1); } else { 
                   isPossible = false;
                   break;
               }
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2017, 15:04
Ответы с готовыми решениями:

Алгоритм получения наилучшего варианта в игре мексиканский поезд
Всех приветствую. Помогите пожалуйста написать хороший алгоритм игры бота в сто одно при игре вдвоём. Порядок хода карт очень важен, т.е...

Поезд отправляется в h1:m1, время в пути h2:m2. Во сколько прибывает поезд?
Есть код, решение простой задачки Поезд отправляется в h1:m1, время в пути h2:m2. Во сколько прибывает поезд? ...

Задача про поезд: будет ли поезд на платформе?
помогите с задачей: поезд прибывает на станцию в а часов b минут и отправляется в с часов d минут. пассажир пришел на платформу в n часов...

1
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
26.02.2017, 17:38
Лучший ответ Сообщение было отмечено _amper как решение

Решение

Цитата Сообщение от _amper Посмотреть сообщение
иначе удалили головы (1) и (2)(можно и 1 и 3, т.е. не важно)
Тут ошибка, так как возможна ситуация, когда потребуется проверить третьи, четвёртые и так далее элементы.

Что касается задачи, то напрашивается решение через рекурсию:
F#
1
2
3
4
5
6
let solve (train : int[]) (left : int[]) (right : int[]) =
    let rec iter i j k =
        if i >= train.Length then true
        else j < left.Length && train.[i] = left.[j] && iter (i+1) (j+1) k
          || k < right.Length && train.[i] = right.[k] && iter (i+1) j (k+1)
    iter 0 0 0
Но при желании, можно заменить рекурсию циклом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool Solve(int[] train, int[] left, int[] right)
{
    Stack<Tuple<int,int,int>> variants = new Stack<System.Tuple<int, int, int>>();
    variants.Push(Tuple.Create(0, 0, 0));
    while (variants.Count > 0)
    {
        var current = variants.Pop();
        int i = current.Item1;
        if(i >= train.Length)
            return true;
        int j = current.Item2;
        int k = current.Item3;
        if(j < left.Length && train[i] == left[j])
            variants.Push(Tuple.Create(i + 1, j + 1, k));
        if (k < right.Length && train[i] == right[k])
            variants.Push(Tuple.Create(i + 1, j, k + 1));
    }
    return false;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2017, 17:38
Помогаю со студенческими работами здесь

Какой правильный алгоритм решения?:)
Даны натуральные числа n и a(1), a(2), ... a(n) .. Найти максимальное простое число. Всем доброго дня:jokingly: Помогите пожалуйста с...

Правильный алгоритм быстрой сортировки
Уважаемые участники форума, подскажите, пожалуйста, правильный алгоритм быстрой сортировки. Который бы работал во всех случаях, чтобы не...

Правильный вывод. Алгоритм Прима
Здравствуйте есть код, нужно изменить вывод. #include&lt;conio.h&gt; #include&lt;iostream&gt; using namespace std; int a,b,u,v,n,i,j,ne=1; ...

Не могу написать правильный алгоритм
Программа не доделана. Вводится n - число строк, которые надо прочесть. В массив nam заносятся названия, последние не должны повторяться. В...

Комментарии к сообщению, правильный алгоритм, циклы
Всем привет. Я тут занимаюсь изучением PHP, я мега новичок и у меня возникла проблема в алгоритме.$selecting_all_from_comments =...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru