Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2011, 20:56   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию Алгоритм для строки или массива.

Задание:
Открыть файл, вынуть оттуда 2 цифры, присвоить переменной а первую цифру, переменной b вторую. // Это все понятно

Суть задачи: А - количество машин советской модели, B - количество иномарок. Нужно расставить машины в рад, так чтобы радом с иномаркой была хотя бы одна советская машина и наоборот.

Из этого я понял:
Возможные комбинации: (С - советская машина, И - иномарка)
Выставить по очереди (при условии что А=В) - С И С И С И С - подходит (самая легкая)

С И С И С С И С И - Подходит, то есть в середине можно поставить две одинаковых машины. (Это при А= В+1)

Если А=В+2 можно вот так

И С И И С И С И И С И

В общем нельзя две одинаковых в начале строки, и/или в конце, и три и больше подряд внутри строки.

Какой будет примерный алгоритм, и как лучше работать: Как с масивом или как со строкой ?
Pascal.

P.S Прошу не опошлять, так получилось с сокращениями
iCaesy вне форума Ответить с цитированием
Старый 22.10.2011, 00:25   #2
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
(при условии что А=В) - С И С И С И С
что-то тут не то)) У тебя 4 "С" и 3 "И". Но не как A=B)

Но все же.. на вскидку:
У тебя есть три случая
1. A=B
2. A>B
3. A<B

В первом все понятно, думаю. Просто последовательно переставляешь С и И и получаешь СИСИСИСИ

А для двух других случаев придумал кое-что. Не думаю, что это оптимально и быстро, но по идее должно работать)
В общем.. Создаешь массив на A+B. Записываешь в начало и конец С в случае A>B. Как ни крути, рядом с ними должны быть И, т.к. массив не замкнут (СС на конце или начале не принимаются). Дальше рядом с И ставишь по С. Дальше рассматриваешь массив, который еще не заполнен. И делаешь тоже самое. Пихаешь С по краям, к ним И, к И прицепляешь С.
Ну выглядит это приблизительно так
A = 8, B = 4;
1. _ _ _ _ _ _ _ _ _ _ _ _
2. С_ _ _ _ _ _ _ _ _ _С
3. СИ_ _ _ _ _ _ _ _ИС
4. СИС_ _ _ _ _ _СИС
5. Рассматриваем подмассив _ _ _ _ _ _ и возвращаемся к пунту 1.
Невооруженным глазом несложно заметить рекурсию)

В принципе, есть казусные ситуации. Например при А=5, Б=4. Но это вы уж сами рассмотрите, а то мне лень писать.

И кстати, вначале нужно сделать проверку на осуществимость задачи. Тоесть, Если, например А больше чем 2*Б, то ничего неполучится)

не силен в паскале. Но по идее, строка - это тот же массив. И я бы работал со строками, т.к. char меньше памяти занимает)))

Последний раз редактировалось Stilet; 22.10.2011 в 20:51.
SteAlzzer вне форума Ответить с цитированием
Старый 22.10.2011, 10:41   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Память роли не играет, главное реализовать задуманное Ща буду пробовать, если у кого есть идеи более короткого алгоритма, буду рад.

Если A - B > 6 или B - A > 6 -> Error !
Думаю такая проверка подойдет.

Есть прикрепленная тема, там все о массивах, вам туда.

Последний раз редактировалось Stilet; 22.10.2011 в 21:17.
iCaesy вне форума Ответить с цитированием
Старый 22.10.2011, 12:57   #4
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от iCaesy Посмотреть сообщение
Если A - B > 6 или B - A > 6 -> Error !
Думаю такая проверка подойдет.
не понял логики. Поясни, пожалуйста
SteAlzzer вне форума Ответить с цитированием
Старый 22.10.2011, 13:30   #5
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

При условии что нельзя в начале и конце ряда по 2 одинаковых авто, но можно между двумя ВВ разместить двк АА = ВААВ и так далее. Но если одних более чем шесть то уже не получается разместить таким способом.
iCaesy вне форума Ответить с цитированием
Старый 22.10.2011, 14:06   #6
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от iCaesy Посмотреть сообщение
При условии что нельзя в начале и конце ряда по 2 одинаковых авто, но можно между двумя ВВ разместить двк АА = ВААВ и так далее. Но если одних более чем шесть то уже не получается разместить таким способом.
это частный случай) Вот вам контрпример: возьмите, например, А = 7 и В = 3. Разница 5, что подходит к вашему условию. Но, однако, составить верную последовательность у вас не получится.

Условие все же заключается в том, что большее кол-во машин не должно привышать вдвое кол-во машин, которых меньше. Примитивная комбинаторика) Каждая наименьшая машина дает два вокантных места на соседство.

И, кстати, алгоритм по идее достаточно легок и быстр ( О(n), если не ошибаюсь)
SteAlzzer вне форума Ответить с цитированием
Старый 22.10.2011, 14:52   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от SteAlzzer
кстати, вначале нужно сделать проверку на осуществимость задачи. Тоесть, Если, например А больше чем 2*Б, то ничего неполучится)
+1
и, кстати, наоборот. Если B> 2*A - тоже не получится расставить машины.

а по поводу того, что брать - массив или строку - это уже сугубо личное дело. и массив можно сделать array[1..A+B] of byte или of char, и строка - по сути своей является массивом array[1..255] of char (правда, в случае строки ещё нулевой элемент задействован под длину строки)..
Если речь идёт о обычном DOS Pascal (TurboPascal), то надо учитывать, что в строке не может быть более 255 элементов.
Массив же ограничен только сегментом данных 64 кб.

Вся сложность в этой задачке именно в алгоритме перебора расстановок.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2011, 15:12   #8
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
+1
и, кстати, наоборот. Если B> 2*A - тоже не получится расставить машины.

а по поводу того, что брать - массив или строку - это уже сугубо личное дело. и массив можно сделать array[1..A+B] of byte или of char, и строка - по сути своей является массивом array[1..255] of char (правда, в случае строки ещё нулевой элемент задействован под длину строки)..
Если речь идёт о обычном DOS Pascal (TurboPascal), то надо учитывать, что в строке не может быть более 255 элементов.
Массив же ограничен только сегментом данных 64 кб.

Вся сложность в этой задачке именно в алгоритме перебора расстановок.
Да, я это дальше описал. Просто там как пример привел для одного случая. Спасибо.
Ну а алгоритм-то я в общем-то написал) Вы сами попробуйте на бумаге. Все работает)
SteAlzzer вне форума Ответить с цитированием
Старый 22.10.2011, 17:37   #9
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от SteAlzzer Посмотреть сообщение
Да, я это дальше описал. Просто там как пример привел для одного случая. Спасибо.
Ну а алгоритм-то я в общем-то написал) Вы сами попробуйте на бумаге. Все работает)
Ну у меня тоже есть кое какие мысли на счет алгоритма. Сейчас попробую реализовать через массив, 1..A+B , потом строку swap'ами.
Классно вам, написали уже ) Я 2й день голову ломаю.
iCaesy вне форума Ответить с цитированием
Старый 22.10.2011, 18:29   #10
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от iCaesy Посмотреть сообщение
Ну у меня тоже есть кое какие мысли на счет алгоритма. Сейчас попробую реализовать через массив, 1..A+B , потом строку swap'ами.
Классно вам, написали уже ) Я 2й день голову ломаю.
я имею ввиду попробуйте реализовать последовательность этого алгоритмя на бумаге. Возьмите 7 и 4, к примеру, и попробуйте)
SteAlzzer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести массив вещественных чисел NxM для заданной строки массива найти два самых больших числа (на C#) владислав10 Помощь студентам 1 10.04.2011 14:10
Строки в delphi. Необходим алгоритм для задачи. Destiny265 Помощь студентам 5 01.04.2011 15:59
Добавление строки или столбца в указанное место массива revaldo666 Общие вопросы C/C++ 11 28.03.2011 16:47
Нужно найти ошибку или написать алгоритм по проще! (строки) velamut Помощь студентам 3 18.06.2010 16:09
Ищем ген. Подрядчика по 1с или партнера Для участия в тендерах или для участия в коммерческих (конкурсных it-up2000 Фриланс 2 24.05.2010 11:51