Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/302: Рейтинг темы: голосов - 302, средняя оценка - 4.54
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514

Морской бой

22.03.2018, 19:29. Показов 66875. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дима любит играть в морской бой. К сожалению, он очень рассеян и постоянно неправильно отмечает на карте клетки, по которым уже стрелял. Напишите класс, который будет строить за Диму карту.

Класс SeaMap должен иметь следующие методы (sm – экземпляр SeaMap):

sm.shoot(row, col, result) — добавить на карту результат выстрела. row — индекс ряда карты. col — индекс вертикальной колонки карты. result — одна из строк “miss” (промах), “hit” (попадание), “sink” (потопление корабля).

sm.cell(row, col) Возвращает ‘.’, если в клетке с координатами row, col может находится корабль. Возвращает ‘*’, если в клетку уже стреляли или она находится рядом с потопленным кораблём. Возвращает ‘x’ если в клетке было попадание.

Метод cell будет вызываться, только когда все обнаруженные на карте корабли потоплены. То есть, не нужно помечать ‘*’ клетки рядом с кораблём в который попали, но не потопили до конца.

Формат ввода
Каждый тест представляет собой код, в котором будет использоваться ваш класс. Файл c решением не обязательно называть solution.py, он будет переименован автоматически. Тест запускается с вашим классом, а его вывод сравнивается с правильным решением.

Пример 1
Ввод
from solution import SeaMap

sm = SeaMap()
sm.shoot(2, 0, 'miss')
sm.shoot(6, 9, 'miss')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
Вывод
..........
..........
*.........
..........
..........
..........
.........*
..........
..........
..........
Пример 2
Ввод
from solution import SeaMap

sm = SeaMap()
sm.shoot(2, 0, 'sink')
sm.shoot(6, 9, 'hit')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
Вывод
..........
**........
x*........
**........
..........
..........
.........x
..........
..........
..........
Пример 3
Ввод
from solution import SeaMap

sm = SeaMap()
sm.shoot(0, 0, 'sink')
sm.shoot(0, 9, 'sink')
sm.shoot(9, 0, 'sink')
sm.shoot(9, 9, 'sink')
for row in range(10):
for col in range(10):
print(sm.cell(row, col), end='')
print()
Вывод
x*......*x
**......**
..........
..........
..........
..........
..........
..........
**......**
x*......*x
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2018, 19:29
Ответы с готовыми решениями:

Морской бой
Помогите решить задачу, Морской Бой, вот условия: Ваш друг любит играть в морской бой на нескольких «досках» сразу, но ленится каждый...

Морской бой
Напишите программу, подготавливающую поле для игры в Морской бой. Море будем обозначать нулями, корабли символом юникода...

Морской бой
Входные данные: В первой строке дается размер поля для морского боя: натуральные числа n и m через пробел, означающие количество строк и...

9
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
22.03.2018, 22:21
Морской бой
1
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
24.03.2018, 13:55  [ТС]
Какой из тех код работает! Скинь его сюда!
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
24.03.2018, 22:38
Там ещё разбираются.
Но в любом случае дублировать тему не за чем
0
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
25.03.2018, 08:43  [ТС]
Кинь ссылку к сообщению! Хотя бы!
0
31 / 29 / 4
Регистрация: 23.03.2019
Сообщений: 15
23.03.2019, 19:51
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
class SeaMap:
    def __init__(self):
        self.map = [['.' for _ in range(10)] for _ in range(10)]  # Создание поля
 
    def shoot(self, row, col, result):
        if result == 'miss':
            self.map[row][col] = '*'
        elif result == 'hit':
            self.map[row][col] = 'x'
        elif result == 'sink':
            for i in range(row - 1, row + 2):
                for j in range(col - 1, col + 2):
                    if 0 <= i < 10 and 0 <= j < 10:
                        if self.map[i][j] == '.':
                            self.map[i][j] = '*'
            self.map[row][col] = 'x'
            for j in range(len(self.map)):  # Если корабль расположен горизонтально
                if self.map[row][j] == 'x':
                    col = j
                    for i in range(row - 1, row + 2):
                        for u in range(col - 1, col + 2):
                            if 0 <= i < 10 and 0 <= u < 10:
                                if self.map[i][u] == '.':
                                    self.map[i][u] = '*'
            for v in range(len(self.map)): # Если корабль расположен вертикально
                if self.map[v][col] == 'x':
                    row = v
                    for v in range(row - 1, row + 2):
                        for u in range(col - 1, col + 2):
                            if 0 <= v < 10 and 0 <= u < 10:
                                if self.map[v][u] == '.':
                                    self.map[v][u] = '*'
 
    def cell(self, row, col):
        return self.map[row][col]
7
5 / 5 / 0
Регистрация: 07.03.2021
Сообщений: 20
18.03.2021, 16:16
Всем привет! Можете мой код поправить к этому заданию
Ввод:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from solution import SeaMap
 
sm = SeaMap()
 
sm.shoot(0, 0, 'hit')
sm.shoot(0, 1, 'sink')
 
sm.shoot(9, 8, 'hit')
sm.shoot(9, 9, 'sink')
 
sm.shoot(2, 3, 'sink')
 
sm.shoot(5, 6, 'miss')
sm.shoot(7, 8, 'miss')
sm.shoot(1, 7, 'miss')
 
sm.shoot(1, 7, 'miss')
 
for row in range(10):
    for col in range(10):
        print(sm.cell(row, col), end='')
    print()
Ожидаемый результат:
xx*.......
*****..*..
..*x*.....
..***.....
..........
......*...
..........
........*.
.......***
.......*xx
Вывод:
xx*.......
*****..*..
..*x*.....
..***.....
..........
......*...
..........
........*.
........**
........xx
Вот мой код:
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
class SeaMap:
    a = {}
    for row in range(10):
        for col in range(10):
            a[(row, col)] = '.'
 
    def shoot(self, row, col, result):
        if result == 'miss':
            self.a[(row, col)] = '*'
        elif result == 'hit' or result == 'sink':
            self.a[(row, col)] = 'x'
        if result == 'sink':
            if (row - 1, col - 1) in self.a:
                if self.a[(row - 1, col - 1)] != 'x':
                    self.a[(row - 1, col - 1)] = '*'
            if (row - 1, col) in self.a:
                if self.a[(row - 1, col)] != 'x':
                    self.a[(row - 1, col)] = '*'
            if (row, col - 1) in self.a:
                if self.a[(row, col - 1)] != 'x':
                    self.a[(row, col - 1)] = '*'
            if (row + 1, col + 1) in self.a:
                if self.a[(row + 1, col + 1)] != 'x':
                    self.a[(row + 1, col + 1)] = '*'
            if (row, col + 1) in self.a:
                if self.a[(row, col + 1)] != 'x':
                    self.a[(row, col + 1)] = '*'
            if (row + 1, col) in self.a:
                if self.a[(row + 1, col)] != 'x':
                    self.a[(row + 1, col)] = '*'
            if (row + 1, col - 1) in self.a:
                if self.a[(row + 1, col - 1)] != 'x':
                    self.a[(row + 1, col - 1)] = '*'
            if (row - 1, col + 1) in self.a:
                if self.a[(row - 1, col + 1)] != 'x':
                    self.a[(row - 1, col + 1)] = '*'
 
    def cell(self, row, col):
        return self.a[(row, col)]
0
1 / 1 / 0
Регистрация: 21.12.2022
Сообщений: 3
27.03.2023, 02:08
Если найдете что-то, что можно было бы упростить в рекурсии, то скажите пожалуйста. Я не могу выразить словами как ненавижу это задание (до двух ночи его писал). Зато хоть приняли.

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
class SeaMap:
    def __init__(self):
        self.map = [['.' for __ in range(10)] for _ in range(10)]
        self.cords = []
        self.count = 0
        self.snk = tuple()
 
    def cell(self, rw, cl):
        return self.map[rw][cl]
 
    def sink(self, y, x):
        new_x, new_y = None, None
        for i in range(min(9, y + 1), max(0, y - 1) - 1, -1):
            for j in range(min(9, x + 1), max(0, x - 1) - 1, -1):
                if self.map[i][j] != 'x':
                    self.map[i][j] = '*'
                elif i == y and j == x:
                    continue
                elif self.map[i][j] == 'x' and (i, j) not in self.cords:
                    if new_x is None:
                        new_x, new_y = j, i
        if new_x is None:
            new_y, new_x = self.snk
            self.count += 1
        if self.count != 2:
            if (new_y, new_x) not in self.cords:
                self.cords.append((new_y, new_x))
            return self.sink(new_y, new_x)
        else:
            return
 
    def shoot(self, rw, cl, result):
        if result == 'miss':
            self.map[rw][cl] = '*'
        elif result == 'hit':
            self.map[rw][cl] = 'x'
        else:
            self.map[rw][cl] = 'x'
            self.snk = (rw, cl)
            self.cords.append((rw, cl))
            self.count = 0
            self.sink(rw, cl)
1
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
27.03.2023, 12:07
Цитата Сообщение от Donon Посмотреть сообщение
Если найдете что-то, что можно было бы упростить в рекурсии
а откуда задача?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SeaMap:
    def __init__(self):
        self.map = [[0] * 12 for _ in range(12)]
 
    def shoot(self, r, c, result):
        # assert result in ('miss', 'hit', 'sink')
        self.map[r+1][c+1] = 1 + (result != 'miss')
        if result == 'sink': self.sink(r+1, c+1)
    
    def sink(self, r, c):
        if self.map[r][c] == 2: # state hit
            self.map[r][c] = 3  # state sink
            for k in range(9):
                dr, dc = divmod(k, 3)
                self.sink(r+dr-1, c+dc-1)
        if self.map[r][c] == 0: # state empty
            self.map[r][c] = 1  # state miss
 
    def cell(self, r, c):
        return '.*xx'[self.map[r+1][c+1]]
3
1 / 1 / 0
Регистрация: 21.12.2022
Сообщений: 3
27.03.2023, 13:46
rRczZZ, из яндекс лицея.
Офигенное решение, кстати. Ща буду разбирать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2023, 13:46
Помогаю со студенческими работами здесь

Морской бой
Эмилия собралась объяснить Максу задачу по алгебре и даже нарисовала числовую прямую. Чтобы увильнуть от скучных примеров, Макс предложил...

Расстановка кораблей морской бой
Всем привет такое задание есть матрица 10х10 в ней мы расставляем корабли(расставляет сама программа рандомно) и проверять на правильность...

Яндекс задачи. Вася с сестрой Соней играли в морской бой. Вася вспомнил, что должен Соне с домашним заданием по р
Добрый день, помогите с задачей Вася с сестрой Соней играли в морской бой. Вася вспомнил, что должен помочь Соне с домашним заданием по...

Напишите упрощенный аналог игры "Морской бой" под условной названием "Летучий голландец"
Напишите упрощенный аналог игры &quot;Морской бой&quot; под условной названием &quot;Летучий голландец&quot;. Игра заключается в том, что программа...

Морской бой
У меня программа должна когда взрываеться весь корабль обрисовывать его &quot;*&quot; подскажите как это можно сделать class SeaMap: def...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru