Problem Statement
Multiplayer Battleships is a game for playerCount players, who take turns one after another. The game field is a rectangular grid containing one or more battleships. A battleship of size p is a 1xp or px1 rectangle, where p is between 1 and 4, inclusive. No two battleships share a cell, a side or a vertex. Each cell of a battleship is called a deck.
In one turn, a player selects one unattacked deck of any battleship and attacks it. If this deck is the last unattacked deck of that battleship, the ship drowns and the player gets p points, where p is the original size of the ship (see example 2). Otherwise, if the ship contains more unattacked decks, the player gets 1 point instead. The game is over when all decks of all battleships have been attacked.
All players follow the same strategy, and each player knows that all the other players are also following this strategy. Each player is trying to maximize his score at the end of the game. If there is more than one ship that the player can attack to achieve the highest possible score, he will pick the one among them whose top-left corner is the highest (i.e., in the uppermost row). If there are still multiple such ships, he will choose the one among them whose top-left corner is farthest to the left (i.e., in the leftmost column).
You will be given the game field in a
Definition
- Class:
- MultiplayerBattleships
- Method:
- getFirstPlayerScore
- Parameters:
- String[], int
- Returns:
- int
- Method signature:
- int getFirstPlayerScore(String[] field, int playerCount)
- (be sure your method is public)
Constraints
- field will contain between 1 and 7 elements, inclusive.
- Each element of field will contain exactly m characters, where m is between 1 and 7, inclusive.
- Each character in each element of field will be either uppercase 'X' or '.'.
- playerCount will be between 1 and 16, inclusive.
- field will contain a valid game field.
- field will contain at least one battleship.
Examples
{"X.", "X."}
2
Returns: 1
The first player attacks one deck for a total of 1 point. The second player will then attack the remaining deck and get 2 points.
{".XXXX.."}
3
Returns: 5
The first player gets two turns. On the first turn, he attacks one deck for 1 point. On the second turn, he attacks the last remaining deck for 4 points.
{".XX", "...", "XXX"}
2
Returns: 6
Hit the bottom ship first.
{"XXXX", "....", "XXXX", "....", "XXXX", "....", "XXXX"}
3
Returns: 12
{"X"}
1
Returns: 1
{ "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X" }
8
Returns: 4
{ "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X" }
2
Returns: 10
{ "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X" }
16
Returns: 3
{ "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X", ".......", "XX.XX.X" }
3
Returns: 10
{"XXXX","...."}
2
Returns: 2
{"XXXX.X.",".......","X.XXX.."}
3
Returns: 6
{".X.",".X.",".X.",".X."}
4
Returns: 1
{"X..X.X","X..X.X","X..X.X",".....X","XXXX.."}
5
Returns: 3
{"..","XX","..",".X","..","XX"}
1
Returns: 7
{"X....","X....","X..XX","X....",".....",".....",".XXXX"}
2
Returns: 5
{"X"}
3
Returns: 1
{"XXX.","...."}
4
Returns: 1
{".X..X.X",".X..X.X",".X..X.X"}
5
Returns: 2
{".XX","...","...","XXX"}
1
Returns: 8
{"X.....","X.XXX.","......","XXX.XX","......"}
2
Returns: 5
{"XX","..","X.","X.","X.","X."}
3
Returns: 2
{".....",".....","XXXX.",".....",".X...",".X..X",".X..X"}
4
Returns: 6
{"X"}
5
Returns: 1
{"....","XXXX"}
1
Returns: 7
{"X..XXXX","X......","X.XXXX."}
2
Returns: 14
{"...","...","X.X","X.X"}
3
Returns: 3
{".....X",".XX..X",".....X","X.....","..XXXX"}
4
Returns: 3
{"XX","..",".X",".X",".X",".X"}
5
Returns: 5
{"X.X..","X.X..","X.X..","X....",".....",".XXXX","....."}
1
Returns: 19
{"X"}
2
Returns: 1
{"....","XXXX"}
3
Returns: 5
{"XXX.X.X","......X",".XXXX.X"}
4
Returns: 5
{"X.X","X.X","X.X","X.X"}
5
Returns: 2
{"X.XXXX","......",".XXXX.","......",".XXXX."}
1
Returns: 22
{"X.","..",".X",".X",".X",".."}
2
Returns: 2
{".XXX.",".....",".....","..XXX",".....","..XXX","....."}
3
Returns: 5
{"X"}
4
Returns: 1
{"....",".XX."}
5
Returns: 1
{"......X","XXXX..X","......X"}
1
Returns: 12
{"..X","..X","X.X","X.X"}
2
Returns: 3
{"......",".X.XXX",".X....",".....X","XXXX.X"}
3
Returns: 5
{"..",".X",".X","..","..","XX"}
4
Returns: 1
{".XXX.",".....",".....",".XXX.",".....",".XXXX","....."}
5
Returns: 4
{"X"}
1
Returns: 1
{"....","XXXX"}
2
Returns: 2
{".......","X.XXXX.","X......"}
3
Returns: 2
{"X.X","X.X","X.X","X.X"}
4
Returns: 2
{".....X","XXXX.X","......","XX.XXX","......"}
5
Returns: 5
{"..","X.","X.","X.","X.",".."}
1
Returns: 7
{"...X.",".....","X..X.","X..X.","X..X.","...X.","....."}
2
Returns: 4
{"X"}
3
Returns: 1
{"....","XXXX"}
4
Returns: 1
{"X.XXXX.","X......","X..XXX."}
5
Returns: 2
{".X.",".X.",".X.","..."}
1
Returns: 5
{"X.XXX.","......",".XXXX.","......","XX.XXX"}
2
Returns: 15
{".X",".X","..","..","XX",".."}
3
Returns: 3
{".X...",".X...",".X...",".X.XX",".....",".X...",".X..."}
4
Returns: 3
{"X"}
5
Returns: 1
{"XXXX","...."}
1
Returns: 7
{"XXX....","....X..","X.X.X..","X.X.X.X","X.X....",".......",".X.X.XX"}
3
Returns: 10
{".......","..XXXX.",".......",".....XX",".......","...X...","...X..."}
2
Returns: 4
{"..XXXX.",".......",".XXX.XX",".......","..X.X.X","......X","XXXX..X"}
5
Returns: 7
{"..XX.XX","X......","....X.X","XXX.X.X","......X","X......","X.XXXX."}
3
Returns: 13
{".......","XX..X..",".......",".....X.","...X...",".......","..X...."}
3
Returns: 2
{".......",".......","....X..","....X..","..X.X..","..X.X..","......."}
4
Returns: 2
{".......",".XXX...",".......","...XX..",".......",".XXXX..","......."}
3
Returns: 5
{"X......","...XX..",".......","X.X.X..",".......",".......","......."}
2
Returns: 3
{"..XXXX.",".......","..XXXX.",".......",".......","..XXX.X","......X"}
3
Returns: 9
{"...X...",".......","X......","..XX..X",".......","X..X...","......."}
5
Returns: 2
{"..XXX..","X.....X","X.XX..X","X......","X.X.XXX",".......","XXX.XXX"}
2
Returns: 24
{"..XXX..","X......","X......","X....X.",".....X.",".....X.",".....X."}
3
Returns: 9
{"X....XX","X.X....","..X.XX.","X.X....","X...X.X","X.X.X.X","X.X.X.X"}
5
Returns: 9
{".....XX",".X.X...",".X....X",".X..X..",".......",".....X.","XXXX.X."}
2
Returns: 7
{"X.XX.X.","X......","X..XXX.","X......","...XXX.",".X.....",".X.XXX."}
2
Returns: 9
{"...XXXX",".......",".X.....",".X.....",".X.XXX.",".X.....","...XXXX"}
2
Returns: 19
{".......",".......","...X...",".......",".......",".......","......X"}
3
Returns: 1
{"..XXXX.","X......","X.XXXX.","X......","X..X.X.","...X.X.","XX.X.X."}
2
Returns: 10
{".......",".XX...X","......X",".......",".......",".......","......."}
2
Returns: 2
{"....XX.",".X.....",".X....X",".X..X..","....X.X","..X.X.X","X...X.X"}
5
Returns: 6
{"...XX..",".......",".X.....",".X..XX.",".......","....X.X","......."}
2
Returns: 4
{"X.XXXX.",".......",".XXX.XX",".......","XXXX.XX",".......","XXX.XXX"}
7
Returns: 7
{".......",".......",".......",".XX....",".......",".......","......."}
5
Returns: 1
{".......","..X....","..X.XX.",".......","..XXXX.",".......","......."}
2
Returns: 4
{".XXXX..","......X","..X....","..X....","..X.X.X","....X.X",".XX.X.X"}
4
Returns: 7
{"X.X.X.X",".......","X.X.X.X",".......","X.X.X.X",".......","X.X.X.X"}
16
Returns: 1
{"XXX.XXX",".......","XXX.XXX",".......","XXX.XXX",".......","XXX.XXX"}
16
Returns: 2
{"X"}
2
Returns: 1
{ "XX.XX.X", "......X", "XX.XX..", "......X", "XX.XX.X", ".......", "XX.XX.X" }
16
Returns: 3
{ ".......", ".......", ".......", ".......", ".......", "...X...", "......." }
16
Returns: 1
{ ".X.....", ".......", ".......", ".......", ".......", ".......", "......." }
1
Returns: 1
{"XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX" }
1
Returns: 40
{"XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX"}
16
Returns: 2
{"XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX", ".......", "XXX.XXX" }
16
Returns: 2
{"..X", "..X", "...", "X.X" }
3
Returns: 2