Problem Statement
You are given a rectangular board consisting of several light panels. Character j of element i of board represents the panel in row i, column j. '*' means the panel is on, and '.' means it's off. When you touch a panel, its state will be toggled. In other words, if you touch a panel that's on, it will turn off, and if you touch a panel that's off, it will turn on. Because the panels are so sensitive, when you touch a panel, all of its horizontally, vertically, and diagonally adjacent panels will also toggle their states.
Your goal is to have all the light panels in the board be on at the same time. Return the minimum number of touches required to achieve this goal, or return -1 if it is impossible.
Definition
- Class:
- LightedPanels
- Method:
- minTouch
- Parameters:
- String[]
- Returns:
- int
- Method signature:
- int minTouch(String[] board)
- (be sure your method is public)
Constraints
- board will contain between 1 and 8 elements, inclusive.
- Each element of board will contain between 1 and 8 characters, inclusive.
- Each element of board will contain the same number of characters.
- board will contain only the characters '*' and '.'.
Examples
{"*****", "*...*", "*...*", "*...*", "*****"}
Returns: 1
Just touch the panel in the center of the board.
{".*"}
Returns: -1
Here touching any panel makes both panels toggle its state. So it's impossible to light both panels at the same time.
{"**.", "**.", "..."}
Returns: 2
First touch the panel in row 0, column 0 to turn all the panels off, and then touch the panel in row 1, column 1.
{"*.*.*", "*.*.*", "....."}
Returns: 5
{"..", ".*", "**", "*."}
Returns: -1
{"........","........","........","........","........","........","........","........"}
Returns: 9
{"*.*.*.*.",".*.*.*.*","*.*.*.*.",".*.*.*.*","*.*.*.*.",".*.*.*.*","*.*.*.*.",".*.*.*.*"}
Returns: -1
{ "****", "*..*", ".***", "...*" }
Returns: 15
{ "......*", ".*.....", ".......", ".......", "..**...", "......*", "*.....*" }
Returns: 32
{ "*******", "*.....*", "*.....*", "*.....*", "*.....*", "*.....*", "*******" }
Returns: 49
{".*.*.*", "******", "....**", ".*.*.*"}
Returns: 10
{".*.*.*.*", "********", "*.*.*.**", "**..**..", "****..**", "..**..**", "*..*****"}
Returns: -1
{"....**", "****..", "****..", "..****", "******", ".****.", "....**", "******"}
Returns: -1
{"**..**", "**..**", "******", "......"}
Returns: 6
{"........", "********", "........", "********"}
Returns: 9
{"."}
Returns: 1
{"*"}
Returns: 0
{"*.", "*.", "**", "**", "..", "*."}
Returns: -1
{"....*.", "*..*..", "..***."}
Returns: 12
{"**", "..", "**"}
Returns: 3
{"*...*", ".*...", "..*.*", "*...*", ".....", "*.*.*"}
Returns: -1
{".*....", "......", "**...*", "*..***", "*..**.", "****..", "*.*.**"}
Returns: 27
{"**..*.*", "*...*.*", ".**.***", "*.**..."}
Returns: 12
{"*", "*", "*", "*"}
Returns: 0
{"*...."}
Returns: -1
{"*..*"}
Returns: 4
{".*.", "...", "***", ".**"}
Returns: 8
{".***", ".*..", "*..*", "**.*"}
Returns: 7
{".*....", "..*.*.", "...*.*", "..*.*."}
Returns: 14
{"..", ".*", ".*", "..", "**"}
Returns: -1
{"**...*", "..*..*", "*...**", "*.***.", "**.*.*", "**..*.", "*...**"}
Returns: 13
{"*.**", "...*", "*..*", ".*..", ".*..", "..**"}
Returns: 15
{".*.."}
Returns: 2
{".**....", "..*****"}
Returns: -1
{"..*", "*.."}
Returns: -1
{".***.*.", "....*.*", "...*...", "**...**", "****.**"}
Returns: -1
{".***", "**.*", "*..*", "..*.", "*..."}
Returns: 7
{"*...", "**..", "..**", "...*"}
Returns: 10
{"....*"}
Returns: -1
{"**", ".*"}
Returns: -1
{".*"}
Returns: -1
{"***.**"}
Returns: 2
{"*....*"}
Returns: 6
{"..*", "*.*"}
Returns: -1
{".****"}
Returns: -1
{".**.", "*.*."}
Returns: -1
{"*", ".", "*", ".", ".", "*"}
Returns: 4
{".**.*.", ".*****", "*.**.*", "******"}
Returns: 12
{"..*", ".*.", ".*.", "**.", "*.."}
Returns: -1
{".**..", "...**"}
Returns: -1
{"**", "**"}
Returns: 0
{".*", "*.", "*.", "*.", "*.", ".."}
Returns: -1
{"..**..", "*...**"}
Returns: -1
{"*****", "**...", "*..*.", "**.**", "*.*.."}
Returns: -1
{"*..*..", "..*...", "**..*."}
Returns: 10
{".", ".", "*", ".", "*", "*", "."}
Returns: 3
{".**", "..*", "**."}
Returns: 5
{".*..*..", "*.*****", "*..*..*", "...*.*.", "*.*****", "*.***.*", ".**..*."}
Returns: 24
{".*.", ".**", ".**", "*.*", "***", ".**"}
Returns: 10
{"*.", "*."}
Returns: -1
{"....", "**.*", "***.", "*..*", ".*.*", ".**."}
Returns: 11
{"***.*..", ".*****.", "...*..*", "*....*.", ".*.*.*.", "...*...", ".*.*..."}
Returns: 26
{"*", "*", "*", "*", "*", ".", "."}
Returns: 1
{".***.", "**..*", "**..*", "..*..", "*...*", ".*.*."}
Returns: -1
{"..*.*.*"}
Returns: 4
{"*.", "*.", "..", "*.", "*.", "**"}
Returns: -1
{".*"}
Returns: -1
{".", ".", "*", "*"}
Returns: 1
{"*****."}
Returns: 4
{"*...", "****", "***.", "...."}
Returns: 7
{".*.*.."}
Returns: 3
{".*.", "*.*", ".**", "*..", "..*", "*.*", "*.*"}
Returns: 10
{"..**.", "..*..", "*****"}
Returns: -1
{".", "*", "*", "*", ".", "."}
Returns: 3
{"***", "*..", "**.", "**.", "***", "*..", "..."}
Returns: 13
{".....*", "***.**", ".***..", "....**"}
Returns: 13
{"***.."}
Returns: 1
{".**.**..","*****...","..*.***.","..****..",".**...*.","*...**..",".**.*...","*.*...*."}
Returns: 24
{"*..**..","***..*.","*.*****",".*..***","*.*.***","..*.***",".*...**","**.**.*"}
Returns: 31
{".*...**.","********","***.***.","*..****.","*.*...*.","..*..***"}
Returns: 27
{"**.**","*...*","...**",".***.","*.*.*","***..","**...",".*..*"}
Returns: 16
{"**...***","*.*....*","*.*..**.","..*...**"}
Returns: 19
{"***","*.*","***","...","...","***",".*.","..."}
Returns: 15
{".*.****.",".*.****."}
Returns: 5
{"*",".","*",".",".",".","*","."}
Returns: 5
{"..*..","*.*.*","*.*.*","*..*.","*..*.","*..*.","*****"}
Returns: 20
{"*.....*","*.....*"}
Returns: 7
{"*",".",".",".",".",".","*"}
Returns: 7
{".....","*.*.*","*.*.*",".*.*.","*.*.*","*****"}
Returns: 18
{"*.*.*",".....","*.*.*",".....","*.*.*"}
Returns: 9
{"*****",".***.","*...*","..*.."}
Returns: 12
{".*.","...",".*.","...",".*."}
Returns: 9
{"**","..","**","..","**"}
Returns: 3
{".*.*."}
Returns: 3
{"..",".."}
Returns: 1
{"*****", "*...*", "*...*", "*...*", "*****" }
Returns: 1
{"*...", "**..", "..**", "...*" }
Returns: 10
{"*...**.*", "**....**", "..*..***", "..**...*", "*...**.*", "**....**", "..*..***", "..**...*" }
Returns: -1
{"**.*.*.*", ".*.*..*.", "..**.**.", "*..*.*.*", ".*.**..*", "***.*..*", "..**..**", "..**.**." }
Returns: -1
{".*" }
Returns: -1
{"........", "........", "........", "........", "........", "........", "........", "........" }
Returns: 9
{".*******", "********", "********", "********", "********", "********", "********", "********" }
Returns: -1
{"*..*.*.*", ".*.*.*.*", "..*.*.*.", "*..**.**", "*...****", ".*.*.*.*", "*.*.*.*.", "****..**" }
Returns: -1
{".*.*.*.*", "*.*.*.*.", ".*.*.*.*", "*.*.*.*.", ".*.*.*.*", "*.*.*.*.", ".*.*.*.*", "*.*.*.*." }
Returns: -1
{"***...*.", ".***...*", "********", ".......*", "****....", "********", "........", "***...**" }
Returns: -1
{"**.*****", ".****.**", "**.*...*", "**.***.*", "****.***", "**..**.*", "..**.*.*", "***.****" }
Returns: -1
{"**.**...", "*..**..*", "......**", "**.**...", "...*..**", "**.***.*", "*****...", "...***.." }
Returns: -1
{"*..***.*", ".**...*.", "*.*.*.*.", "....****", "**..*..*", "****.**.", "********", "..**..*." }
Returns: -1
{"*...*", "**...", "..**.", "...*.", "*...*", "**...", "..**." }
Returns: -1
{"*.*.*.*.", "*.*.*.*.", "*.*.*.*.", "*.*.*.*.", "*.*.*.*.", "*.*.*.*.", "*.*.*.*." }
Returns: -1