0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 3
|
||||||
1 | ||||||
Битва между офисами в морской бой08.03.2015, 00:38. Показов 1489. Ответов 1
Метки нет (Все метки)
Само условие
Битва между офисами Время: 1000ms, Память: 128MB, Сложность: 30%; Попытка: 11, Начислено баллов: 0 Среди офисных работников ряда предприятий в свое время была популярная игра "Морской бой". Игра ведется на прямоугольном поле произвольных размеров N×M (1≤ N, M ≤ 10^4), где N - количество строк, M - количество столбцов. Приближается чемпионат между офисами по морскому бою. Планируется вести его трансляцию в режиме реального времени: демонстрировать карту с кораблями и выводить статистику: количество целых, подбитых и уничтоженных кораблей, находящихся на поле. Требуется написать программу для подсчета статистики. Корабль на поле — это связанная фигура, стоящая из одной или нескольких рядом лежащих клеток, имеющих общую сторону. Корабли могут быть абсолютно любых форм и размеров! Входные данные: Выходные данные: Первая строка входного потока содержит два целых числа N и M, разделённых пробелами - размеры игрового поля. Далее идут N строк по M символов - описание игрового поля. Латинская буква 'X' обозначает подбитую клетку корабля, а 'S' — не подбитая клетка корабля, '-' — свободное водное пространство. В выходной поток вывести три числа, каждое в отдельной строке: количество целых кораблей количество подбитых кораблей количество уничтоженных кораблей Пример входного файла (input.txt): 3 8 ---SSS-- XX--S-X- X-S---S- Решение
0
|
08.03.2015, 00:38 | |
Ответы с готовыми решениями:
1
«Морской бой» - на Pascal Матрица. морской бой Морской бой: написать проверку для расстановки последнего корабля Морской бой |
Модератор
|
|
08.03.2015, 09:07 | 2 |
Для начала определиться с ошибкой. Для FreePascal читаем "user.pdf" раздел "Run-time errors"
Ещё, по условию m и n <=10^4, а матрица определена до 9999. Никаких мыслей по исправлению, особо, нет. Может быть пойти другим путём решения. Или попробовать директивы компиляции, изменяющие размер стека $MEMORY или $MINSTACKSIZE (см. "prog.pdf"). Добавлено через 33 минуты Другой путь (нерекурсивный): 1. Завести байтовый массив состояний каждого корабля (отсутствует, целый, уничтоженный, раненый) он по размерам не будет превышать . 2. Просматривать a слева-направо сверху-вниз. 3. Встретилась непустая клетка. - Если слева и сверху нет соседей, то это новый корабль. Номер нового корабля записываем в a вместо состояния (S или X). - Если есть соседи, то в текущей клетке продолжение "известного" корабля. Модифицируем состояние корабля (допустим, что до сих пор состояние было "целый", а текущая клетка "Х", меняем состояние на "ранен"). - Может получится, что из-за изогнутости корабля мы считали его как два разных, но вот в текущей клетке "разные" корабли встретились. Модифицируем состояние корабля с меньшим номером, а корабль с большим номером удаляем (в состояние "отсутствует"). Здесь "минус" в нерациональном расходе памяти (массив кораблей, увеличение разрядности элементов поля), а "плюс" в переносе памяти из стека в сегмент данных (или в кучу). Можно немного оптимизировать расход памяти на массив кораблей, разрядность матрицы a, за счёт соображения, что одновременно может рассматриваться не более max(n,m)/2 кораблей (т.е. не более 5*10^3), но это усложнит алгоритм, а памяти можно выделять до 128М.
0
|
08.03.2015, 09:07 | |
08.03.2015, 09:07 | |
Помогаю со студенческими работами здесь
2
Игра "Морской бой" Процедура стрельбы. Морской бой Морской бой - запрограммировать ход компьютера Игра "Морской бой" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |