Gra w statki

Zadanie 11 z 14 · rozdział 13Trudność: 3 z 3macierzegrapętlesymulacja

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łach albo Pozostał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 z X albo o.
  • Aby sprawdzić zatopienie, od trafionego pola idź w każdą z czterech stron, dopóki trafiasz na pola statku (# lub X). 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łąd EOFError; konstrukcja try / except EOFError przechwytuje go i kończy pętlę.

Przykład

Wejście
#.........
#.........
..........
....###...
..........
..........
.........#
..........
.##.......
..........
1 1
5 5
2 1
1 1
11 3
7 10
Wyjście
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.

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.

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
Wejście
..........
.##.......
..........
..........
......#...
......#...
......#...
..........
..........
..........
2 2
2 3
6 7
1 1
5 7
7 7
3 3
Oczekiwane wyjście
Trafiony
Trafiony, zatopiony
Trafiony
Pudło
Trafiony
Trafiony, zatopiony
Wygrana po 6 strzałach

Test 2

Nie uruchomiono
Wejście
#.#.#.....
..........
..........
..........
..........
..........
..........
..........
..........
..........
Oczekiwane wyjście
Pozostało statków: 3

Test 3

Nie uruchomiono
Wejście
.........#
..........
..........
..........
..........
..........
..........
..........
..........
......####
0 5
10 11
3
a b
1 2 3
-1 4
1 10
10 10
10 7
Oczekiwane wyjście
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
Wejście
..........
..........
...#......
...#......
..........
........#.
..........
..........
..........
..........
3 4
3 4
5 5
5 5
x
4 4
6 9
Oczekiwane wyjście
Trafiony
Pole już ostrzelane
Pudło
Pole już ostrzelane
Niepoprawny strzał
Trafiony, zatopiony
Trafiony, zatopiony
Wygrana po 7 strzałach

Test 5

Nie uruchomiono
Wejście
..........
.#........
.#........
.#........
.#........
..........
..........
...###....
..........
..........
3 2
8 5
8 4
8 6
1 2
6 2
Oczekiwane wyjście
Trafiony
Trafiony
Trafiony
Trafiony, zatopiony
Pudło
Pudło
Pozostało statków: 1
Uruchom z własnymi danymi