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

Задача Пираты Баренцева моря

29.05.2021, 15:00. Показов 9825. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вася играет в настольную игру «Пираты Баренцева моря», которая посвящена морским битвам. Игровое поле представляет собой квадрат из
N
×
N
клеток, на котором расположено
N
кораблей (каждый корабль занимает одну клетку).
Вася решил воспользоваться линейной тактикой, для этого ему необходимо выстроить все
N
кораблей в одном столбце. За один ход можно передвинуть один корабль в одну из четырёх соседних по стороне клеток. Номер столбца, в котором будут выстроены корабли, не важен. Определите минимальное количество ходов, необходимых для построения кораблей в одном столбце. В начале и процессе игры никакие два корабля не могут находиться в одной клетке.

Формат ввода
В первой строке входных данных задаётся число
N
(1≤N≤100).
В каждой из следующих
N
строк задаются координаты корабля: сначала номер строки, затем номер столбца (нумерация начинается с единицы).

Формат вывода
Выведите одно число — минимальное количество ходов, необходимое для построения.



Python
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
n = int(input())
mp = [[0 for i in range(n)] for j in range(n)]
points= []
stolb = [0]*n
for i in range(n):
    a, b= list(map(int, input().split()))
    mp[b-1][a-1]=1
    points.append([a-1, b-1])
    stolb[b-1] += 1
if n == 1:
    print(0)
else:
    ch = n
    indmx = 0
    path = 0
    many = []
    mxst = max(stolb)
    for i in range(n):
        if stolb[i] == mxst:
            ind = i
            many.append(i)
 
    mnrsn = n
    if len(many)>1:
        for i in many:
            if abs(i - (n-1)//2) < mnrsn:
                mnrsn = abs(i - n//2)
                print(mnrsn)
                ind = i
    print(ind, many)
    for i in range(n):
        print(mp[i])
    print('')
    for i in range(n):
        x, y = points[i][1], points[i][0]
        mp[x][y] = 0
        y_new = y
        if mp[ind][y_new%n]==1:
            y_new = 0
            while y_new<n and mp[ind][y_new%n]==1:
                y_new += 1
        mp[ind][y_new%n] = 1
        path += abs(x-ind) + abs(y-y_new%n)
    for i in range(n):
        print(mp[i])
    print(path)
но оно на одно из тестов выдает ошибку. подскажите что не так или же напишите пожалуйста решение
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.05.2021, 15:00
Ответы с готовыми решениями:

Пираты Карибского моря 4
будут ли Пираты Карибского моря 4??в сети написано, что будет называтся &quot;в поисках святого Грааля&quot;, а вы встречали где нибудь...

Пираты Карибского моря: На странных берегах
Пираты Карибского моря: На странных берегах Жанр приключения Режиссёр Роб Маршалл Продюсер Джерри Брукхаймер Автор сценария ...

Задача: Известна высота над уровнем моря каждого километра 100-километровой автотрассы.
Всем привет! Вот сама задача: Известна высота над уровнем моря каждого километра 100-километровой автотрассы. Определить, на каком...

31
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
29.05.2021, 16:57
обычный перебор вроде.
не смог уловить ход ваших мыслей в коде.
0
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 15:52  [ТС]
Можете написать пожалуйста, как это правильно сделать?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.05.2021, 16:08
вроде так:
Python
1
2
3
4
5
6
n = int(input())
a = [tuple(map(int, input().split())) for _ in range(n)]
a.sort(key=lambda x: x[1])
d = [sum(abs(x+1-p[0])+abs(y+1-p[1]) for x, p in enumerate(a)) for y in range(n)]
print(min(d))
print('столбец №', d.index(min(d))+1)
2
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 16:18  [ТС]
Так нужно же вывести минимальное количество ходов, необходимое для построения
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.05.2021, 16:19
в 5й строке выводится это.
1
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 17:20  [ТС]
выдает WrongAnswer на 11 тесте, мое решение дошло лишь до 15

Добавлено через 55 минут
Может быть такое что там есть случаи не поддающиеся простому перебору, подскажите пожалуйста очень нужно
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.05.2021, 17:21
Igrez_z_z1, примеры ввода/вывода есть?
0
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 17:22  [ТС]
3
1 2
3 3
1 1

вывод

3

Только такой
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.05.2021, 19:19
кинь в ЛС ссылку на проверяющую систему
0
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 19:22  [ТС]
это яндекс контест там не показывает сами значения
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
30.05.2021, 19:51
ну попробуй так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
n = int(input())
a = [tuple(map(int, input().split())) for _ in range(n)]
a.sort(key=lambda x: x[1]) # сортируем корабли по координате столбца
d = []
for y in range(1, n+1):  # перебираем столбцы
    s = 0  # накапливаем сумму
    b = [(i, j) for i, j in a if j != y]  # все корабли не в этом столбце
    c = [i for i, j in a if j == y] # строки кораблей которые в этом столбце
    x_set = set(range(1, n+1)) - set(c) # оставляем только строки где нет кораблей в этом столбце
    # print(b, x_set)
    for i, x in enumerate(sorted(x_set)):  # перебираем корабли вне этого столбца, sorted для старой версии python
        s += abs(x-b[i][0]) + abs(y-b[i][1]) # прибавляем расстояние от корабля до нужной клетки
    d.append(s)
print(min(d))
комментарии только убери.
0
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
30.05.2021, 19:55  [ТС]
все тот же 11 тест WrongAnswer(

Добавлено через 2 минуты
я переворачивал матрицу и собирал строчки вместо столбцов и у меня не правильно обрабатывалось в случае если две сразу имели к одной "пустоте" одинаковую длину и я добавил чтоб с двух сторон шло по массиву но где-то все равно не так сделал
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
31.05.2021, 15:47
eaa, вот такая конфигурация:
6
1 1
1 2
1 3
4 1
4 2
4 3
Если не ошибаюсь, то можно за 10 ходов сделать. А ваш код дает ответ 12
2
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
31.05.2021, 15:49  [ТС]
А вот как сделать чтобы все случаи обрабатывало не очень понятно
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2021, 15:56
u235, вроде жадный алго тут.

Добавлено через 2 минуты
да 10 ответ. может где координаты напутал. посмотрю.

Добавлено через 3 минуты
гыгыгы...
сортировку надо так и так проверять
a.sort(key=lambda x: x[0])
потом так
a.sort(key=lambda x: x[1])
1
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
31.05.2021, 18:07  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = int(input())
a = [tuple(map(int, input().split())) for _ in range(n)]
a.sort(key=lambda x: x[0])
a.sort(key=lambda x: x[1])# сортируем корабли по координате столбца
d = []
for y in range(1, n+1):  # перебираем столбцы
    s = 0  # накапливаем сумму
    b = [(i, j) for i, j in a if j != y]  # все корабли не в этом столбце
    c = [i for i, j in a if j == y] # строки кораблей которые в этом столбце
    x_set = set(range(1, n+1)) - set(c) # оставляем только строки где нет кораблей в этом столбце
    # print(b, x_set)
    for i, x in enumerate(sorted(x_set)):  # перебираем корабли вне этого столбца, sorted для старой версии python
        s += abs(x-b[i][0]) + abs(y-b[i][1]) # прибавляем расстояние от корабля до нужной клетки
    d.append(s)
print(min(d))
Все еще ошибка на 11 тесте
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2021, 18:24
Igrez_z_z1, ты не правильно понял.
сначала сортируешь по строкам находишь результат.
потом сортируешь по столбцам находишь результат.
и выводишь минимум из этих двух результатов.
"заверни" решение с 4й строки в функцию.

Добавлено через 6 минут
если не получится с сортировкой,
значит на каждом шаге нужно просто выбирать ближайший корабль.
это в 12й строке.
0
1 / 1 / 0
Регистрация: 29.05.2021
Сообщений: 19
31.05.2021, 18:25  [ТС]
Что-то не получается, можете написать пожалуйста
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
31.05.2021, 21:19
Я же написал как сделать. Пробуй самостоятельно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2021, 21:19
Помогаю со студенческими работами здесь

Пираты
Однажды на рассвете, когда мы после долгого плавания шли между Канарскими островами и Африкой, на нас напали пираты – морские разбойники....

Пираты
Однажды на рассвете, когда мы после долгого плавания шли между Канарскими островами и Африкой, на нас напали пираты – морские разбойники....

Пираты силиконовой долины
Кто нибудь смотрел, можно узнать ваше мнение?

Половина пользователей Рунета — иностранные пираты
По данным исследовательской компании SpyLog, количество любителей пиратского контента из-за рубежа в настоящий момент составляет около 52%...

Как шведские пираты разобрались с Electronic Arts
Компания Electronic Arts потребовала прекратить функционирование шведского сайта Pirate Bay, являющегося одним из крупнейших ресурсов,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru