Gra w statki
Treść zadania
Wczytaj planszę 10×10 do gry w statki, a potem kolejne strzały gracza i rozstrzygnij każdy z nich.
Na planszy . oznacza wodę, a # pole statku. Każdy statek to poziomy albo pionowy odcinek złożony z jednego lub kilku pól #; statki nie stykają się ze sobą ani bokami, ani rogami.
Strzał to para r c — numer wiersza i numer kolumny, liczone od 1 (lewy górny róg to 1 1). Dla każdego strzału wypisz jedną linię:
Niepoprawny strzał— linia nie składa się z dokładnie dwóch liczb całkowitych z zakresu od 1 do 10,Pole już ostrzelane— w to pole już wcześniej strzelano (niezależnie od wyniku tamtego strzału),Pudło— w polu jest woda,Trafiony— w polu jest statek, ale ma on jeszcze nietrafione pola,Trafiony, zatopiony— trafiono ostatnie nietrafione pole statku.
Gdy zatopiony zostanie ostatni statek, wypisz dodatkowo Wygrana po X strzałach i zakończ program — pozostałe linie wejścia pomiń. X to liczba wczytanych linii ze strzałami aż do tego strzału włącznie (liczą się wszystkie strzały, także niepoprawne i powtórzone).
Jeśli strzały się skończą, zanim wszystkie statki zostaną zatopione, wypisz na końcu Pozostało statków: Y, gdzie Y to liczba niezatopionych statków.
Dane wejściowe
- 10 linii po 10 znaków
.lub#— plansza - następnie dowolnie wiele linii (także zero) — strzały
r c, aż do końca danych
Dane wyjściowe
- Po jednej linii z wynikiem dla każdego rozpatrzonego strzału.
- Na końcu
Wygrana po X strzałachalboPozostało statków: Y.
Ograniczenia
- na planszy jest co najmniej jeden statek, a pól
#jest łącznie co najmniej 2 - co najwyżej 200 strzałów
Uwagi
- Planszę trzymaj jako listę list znaków (
list(input())) i zaznaczaj na niej strzały, np.X— trafione pole statku,o— pudło. Wtedy „pole już ostrzelane” to pole zXalboo. - Aby sprawdzić zatopienie, od trafionego pola idź w każdą z czterech stron, dopóki trafiasz na pola statku (
#lubX). Statek jest zatopiony, gdy żadne z jego pól nie jest już#. - Liczbę statków na początku policzysz, zliczając pola statków, które nie mają pola statku ani nad sobą, ani po lewej stronie — każdy statek ma dokładnie jedno takie pole.
- Kod startowy wczytuje wszystkie strzały do listy. Gdy dane wejściowe się skończą,
input()zgłasza błądEOFError; konstrukcjatry/except EOFErrorprzechwytuje go i kończy pętlę.
Przykład
#......... #......... .......... ....###... .......... .......... .........# .......... .##....... .......... 1 1 5 5 2 1 1 1 11 3 7 10
Trafiony Pudło Trafiony, zatopiony Pole już ostrzelane Niepoprawny strzał Trafiony, zatopiony Pozostało statków: 2
Na planszy są 4 statki: pionowy w kolumnie 1 (wiersze 1–2), poziomy w wierszu 4 (kolumny 5–7), jednomasztowiec w polu 7 10 i poziomy w wierszu 9 (kolumny 2–3). Zatopiono dwa z nich.
Potrzebujesz teorii?
Zasady obowiązujące w rozdziale 13
Zadania w tym rozdziale ćwiczą pracę z listami dwuwymiarowymi (macierzami): tworzenie, wczytywanie, przechodzenie po wierszach i kolumnach oraz przekształcanie.
Każde zadanie (oraz każdy podpunkt) jest osobnym, niezależnym programem: czyta standardowe wejście (stdin) i wypisuje wynik na standardowe wyjście (stdout).
Konwencje wspólne:
- Dane wczytuj dokładnie w kolejności podanej w sekcji Wejście.
- Wiersz macierzy na wejściu to jedna linia z liczbami oddzielonymi spacjami — wczytaj całą linię i rozbij ją po spacjach (
input().split()). - W wyjściu macierzy: każdy wiersz w osobnej linii, elementy oddzielone pojedynczą spacją.
- Program nie wypisuje komunikatów typu „Podaj liczbę:”.
Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.
Przywrócono Twój zapisany kod.
Python uruchomi się w przeglądarce przy pierwszym teście.
Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.
Testy
Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.
Test 1
Nie uruchomiono.......... .##....... .......... .......... ......#... ......#... ......#... .......... .......... .......... 2 2 2 3 6 7 1 1 5 7 7 7 3 3
Trafiony Trafiony, zatopiony Trafiony Pudło Trafiony Trafiony, zatopiony Wygrana po 6 strzałach
Test 2
Nie uruchomiono#.#.#..... .......... .......... .......... .......... .......... .......... .......... .......... ..........
Pozostało statków: 3
Test 3
Nie uruchomiono.........# .......... .......... .......... .......... .......... .......... .......... .......... ......#### 0 5 10 11 3 a b 1 2 3 -1 4 1 10 10 10 10 7
Niepoprawny strzał Niepoprawny strzał Niepoprawny strzał Niepoprawny strzał Niepoprawny strzał Niepoprawny strzał Trafiony, zatopiony Trafiony Trafiony Pozostało statków: 1
Test 4
Nie uruchomiono.......... .......... ...#...... ...#...... .......... ........#. .......... .......... .......... .......... 3 4 3 4 5 5 5 5 x 4 4 6 9
Trafiony Pole już ostrzelane Pudło Pole już ostrzelane Niepoprawny strzał Trafiony, zatopiony Trafiony, zatopiony Wygrana po 7 strzałach
Test 5
Nie uruchomiono.......... .#........ .#........ .#........ .#........ .......... .......... ...###.... .......... .......... 3 2 8 5 8 4 8 6 1 2 6 2
Trafiony Trafiony Trafiony Trafiony, zatopiony Pudło Pudło Pozostało statków: 1