Problem Statement
Flip-Flop is a puzzle played with a m by n grid of cells. Each cell has a colored peg, which can be one of three colors: Red, Green, or Blue. Here are some examples of what the grid may look like ('R' for Red, 'G' for Green, 'B' for Blue):
-
RRGGB RGBRGB RRR RRRGG GBRGBR GGG GRRRR BRGBRG BBB GGRRR BGGRR
A color-switch is defined as changing the peg from one color to another. Red switches to Green. Green switches to Blue. Blue switches to Red.
A move is made by first choosing one of the pegs and doing a color-switch on it (the flip). Then, its (up to) four neighboring pegs are color-switched (the flop). Diagonal neighbors do not count, only vertical and horizontal neighbors do. Edges do not wrap around.
For example (the coordinates are represented as a (row, col) pair):
12345 12345 12345 1 BBBGG 1 BBBBB 1 BBBBB 2 BBBBG 2 BBBBB 2 BBBBB 3 BBBBB --> 3 BBBBB --> 3 BBBBB 4 GBBBB 4 GBBBB 4 BBBBB 5 GGBBB 5 GGBBB 5 BBBBB Move 1 | Move 2 -----------+------------ flip(1,5) | flip(5,1) flop(1,4) | flop(4,1) flop(2,5) | flop(5,2)
Another example:
12345 12345 12345 12345 12345 1 BRBBG 1 BGBBG 1 BBBBG 1 BBBBG 1 BBBBB 2 RRRGG 2 GGGGG 2 BBBGG 2 BBBGG 2 BBBBB 3 BRGBG --> 3 BGGBG --> 3 BBGBG --> 3 BBBBG --> 3 BBBBB 4 BGGGB 4 BGGGB 4 BGGGB 4 BBBBB 4 BBBBB 5 BBGBB 5 BBGBB 5 BBGBB 5 BBBBB 5 BBBBB 6 BBBBB 6 BBBBB 6 BBBBB 6 BBBBB 6 BBBBB Move 1 | Move 2 | Move 3 | Move 4 -----------+-------------+-------------+------------ flip(2,2) | flip(2,2) | flip(4,3) | flip(2,5) flop(1,2) | flop(1,2) | flop(3,3) | flop(1,5) flop(2,1) | flop(2,1) | flop(4,2) | flop(2,4) flop(2,3) | flop(2,3) | flop(4,4) | flop(3,5) flop(3,2) | flop(3,2) | flop(5,3) |
The object of Flip-Flop is to start with some initial board position and reach the board with all Blue pegs by making a series of moves. Some initial positions are solvable. But for others, it is impossible. For each solvable initial position, there exists a minimum number of moves required to solve the puzzle.
You are given a
Definition
- Class:
- FlipFlop
- Method:
- minMoves
- Parameters:
- String[]
- Returns:
- int
- Method signature:
- int minMoves(String[] board)
- (be sure your method is public)
Constraints
- board contains between 2 and 10 elements, inclusive
- board contains only the uppercase letters 'R', 'G', 'B'
- Each element of board contains between 2 and 10 characters
- All elements of board have the same length
Examples
{"BBBGG", "BBBBG", "BBBBB", "GBBBB", "GGBBB"}
Returns: 2
This is the same as the first example. It requires a minimum of 2 moves.
{"BRBBG", "RRRGG", "BRGBG", "BGGGB", "BBGBB", "BBBBB"}
Returns: 4
This is the same as the second example. It requires a minimum of 4 moves.
{"RRG", "RGG"}
Returns: 3
Flip the top-left corner twice and the bottom-right corner once.
{"RRRBRGGB", "BRBGGBGR", "RBGBBGRG"}
Returns: -1
This position is unsolvable.
{"BBBBBB", "BGGGGB", "BGRRGB", "BGRRGB", "BGGGGB", "BBBBBB"}
Returns: 32
{"RRRGGGBBB", "RRRGGGBBB", "RRRGGGBBB", "BBBRRRGGG", "BBBRRRGGG", "BBBRRRGGG", "GGGBBBRRR", "GGGBBBRRR", "GGGBBBRRR"}
Returns: 69
{"BBBBBBBBBB", "BGGGGGGGGB", "BGBBBBBGBB", "BBBRBBGBBB", "BBBBRGBBBB", "BBBBGRBBBB", "BBBGBBRBBB", "BBGBBBBBGB", "BGGGGGGGGB", "BBBBBBBBBB"}
Returns: 104
Watch for timeout!
{"GRRRRRRRRB", "RRRRRRRRRR", "RRRRRRRRRR", "RRRRRRRRRR", "RRRRGBRRRR", "RRRRBGRRRR", "RRRRRRRRRR", "RRRRRRRRRR", "RRRRRRRRRR", "BRRRRRRRRG"}
Returns: 128
{"GRRRB","GBRGB","RRBRG","BRBBB","RBGBB","RGBRG"}
Returns: 29
{"BGGRBRGR","BGRRBGBG","BRGRRBBB","RRGRGRBG","RRGRBBGB","BBRBBRBB","BRRRGGBG","RBGRGRBB"}
Returns: -1
{"BGRGGRB","RBRBGGG","RGGGGGB","RRRGGGR","GGGRRRR","BGRGGBR"}
Returns: 40
{"GGR","BGB","RBR","RRB","BBB","GBR","RRG"}
Returns: 22
{"RGRGBBGRG","GGBRGGBGB","GRBRGRRBB","GGRGBRGGB","GGRRBRBBB","RRRGBGBGR"}
Returns: 50
{"BRBRRGBR","RBBRBBRB","BBBBRRGB","GGBBGRBR","RGBBGRGB","GRRRBRBB","GGRBRRRR"}
Returns: 50
{"GBBGRG","BBGGGG","GGBBRG","BGGRGB","GBRBRB","BBBBBG","RRBGRB","GBBGRG"}
Returns: 47
{"RBBBBG","RBRGGR","GBGRRR","BRBGGB","RRRGBG","GRBBBB"}
Returns: 26
{"BBRBGGGRBR","GRBGRBGBRB","RRGRBGRRBR","BGBGRGGRBG"}
Returns: 42
{"GRBBRBRGRB","GGRGRGBGGR","BBGGGGGGGB","RRGGGBGBRG","BRBBGRBBRG","BGBBRBGRBG","GGBGRBRBGG","GRBBGRGGRB","GRRGBBGGGR"}
Returns: 86
{"RBBBB","BRRBR","RRGGR"}
Returns: 12
{"RBRRGRRR","GGGBRRBR","GRGGBBRG","BRBGGGRB"}
Returns: 34
{"RRGGRG","BGGGBG","BRGGBB","BBGGGB","BRBRRB","RRBRGR","BBRBBB","GGGBGR","RRBBGB"}
Returns: 51
{"GGBRRBBR","RRBRRBRB"}
Returns: -1
{"BGRB","BGRB","BBBB","RBGG","RRRR","RGGR"}
Returns: 26
{"BGGGBBRGR","GGRBBRGGB","GRBGBGBGB","RRBGBBRRG","RBBBRGRGG","BGGGRRRBG","BRBBBBGRB","BRRRGRGRR","GBRBGBBRB"}
Returns: -1
{"BB","RR","BR","BG","RR","GB","GR"}
Returns: 12
{"GGRBGG","GGBRGB","GBRRRB","BBRGGG","RRBGRR","GRRGGG","BGBGBB","GRBRGR"}
Returns: 39
{"GBBBGGGRB","BBBRBGRRB","GGGGGRBBB","RRGGBGBGG","GGBRBRGRB","GGGBBBGBR","RBBRRRRGG","GBRGGBBGG","BBBGGGBGG"}
Returns: -1
{"GGBG","BRGR","RRRB","RRGR","BRGG","GRBB"}
Returns: 32
{"BBGB","BBGB","BGBR","RRRG","BGGG","GGGR","BBGR","BRBB","BGGB"}
Returns: -1
{"RB","RG","BG"}
Returns: 6
{"GGGRRGGRGB","RBRBBRGRGR","RGGRGBRRBG"}
Returns: 26
{"RBRRG","RRBGR","RBBRG"}
Returns: 19
{"BRGRG","GRGBR","RGGRB","RBGRG","GGRGG","GBRRR","RGBGG","GGRGB","BBRGB","BRBGB"}
Returns: 52
{"BGG","RRB","GGR","RRG","GBR","GGB","BRB","RRR","GBR"}
Returns: -1
{"RRBGRBGRG","GGRGRGBRG","RBGBBBGRB"}
Returns: -1
{"RGRGRRBGR","BGBBGGBBB","BRGBBBRBR"}
Returns: -1
{"GBRR","BBBG","GBRR","GBGR","RGBG","RRBG","RGRR","RGRR","GRGR","RRRR"}
Returns: 46
{"GBGBGRBRB","RBBBGBRRG"}
Returns: -1
{"BBGRBBGR","BGGGRGGG","BRGRGGGR","BRBRGGRR","GBRRRRBR","GRBBRGRG","BGGBRGBR"}
Returns: -1
{"RBGG","BBBR","RBRR","GRGR","BGBB","BRGG","GRRR","BRGB","BBRB","BGBB"}
Returns: 44
{"RBBGRBBRBG","RBBBBGBRBR","RGBRGGBBBR","RBBBRBGGRR","GGGGGGGGBR","BGGRRGBGGB","GGBRGGBBGB","GGBBBGGBGR","GBRBBBBGRR","RGBBBBRRGB"}
Returns: 102
{"BBRBGR","BRRRRG","RRRBRB","RGGBRG","RBRRRR","BBBGGB","RRRBBB"}
Returns: 40
{"GRRGGGRBG","GGGGGBBRR","RBGGRGRRG","GBRGBBBRR","BBRGRBBBR","BRRRRRBGR","BGGGBRRGB","GGRBRGBGR","BBRBGBBBR","BGGBBRRRR"}
Returns: 91
{"BRGRGRR","RBRRGGG","BRBGBGB","GRBGBBB","BRRRGRG","GRGRRBR","BBRBGRG"}
Returns: 50
{"RBBRRBR","BGRBRGR"}
Returns: -1
{"RRGGR","GRGBG","GGGGR","BRRGG","BBRRG","GRRRG","BGGGG","RGRBR","RGRGB","RGBGG"}
Returns: 54
{"BBRGBGRRB","RGBBGGBRB","GGGBRBBGG","RGGGRBGBG","RBBBRGGRG","RBGRBRGGG"}
Returns: 54
{"GGGGGB","RRGBBR","RRGRRR","GGBRGR"}
Returns: 31
{"GRBRB","RRGGR","RBRBB","GGBBR","GBGGB","RBGRB","RBBGB","BRBRG","GBBGB"}
Returns: 36
{"RRBRRBGGGB","GRRGBGRRRR","RBBGRBRGBG","BBGRGBRBBG"}
Returns: 35
{"GGGRBGBRRB","RRGGRGRRRR","BBRRGRRBGR","GGGBRRBGRR","BBBBGGGGRB","GBBGGRBRGB","RRGBBBBRBB","GBRBGBBRRR","GRGRRRRGBG","GBGGBBBRGG"}
Returns: 97
{"BR","RR"}
Returns: 2
{"BGRRBRGBR","RGGRRBGGG","GRGRBBGGG","GGRGBRRGG","GRBGGRGGG","RRGBGGBGG","BRBBGGBRR","BRGRGGGRB","RGRRGGRGR","RRRBBRRBG"}
Returns: 84
{"RG","RG","RR","RR","RB","RR","RG","BG"}
Returns: -1
{"BBBGRRGR","GGGRGGGR","BGBGBBBB","BRRBBRRB","GRBBBBGG","GBGBRRRB","RGRRRRGG","GBBRRBBR"}
Returns: -1
{"BGBRG","GGGRB","BBGGG","RBBBB","GRGBR","GGBRG","GRRGB","GBRBR","GBRGR"}
Returns: 46
{"GRRBRRB","BRBBBRG","RBGRRRG","GBGRBBR"}
Returns: 22
{"RBBRGRGBGG","BBGBGGBGRR"}
Returns: 27
{"BBBBBBBB", "BBBBBBBB", "BBBBBBBB", "BBBBBBBB", "BBBBBBBB", "BBBBBBBB", "BBBBBBBB"}
Returns: 0
{"BB", "BB"}
Returns: 0
{ "BBBBBBBBBB", "BGGGGGGGGB", "BGBBBBBGBB", "BBBRBBGBBB", "BBBBRGBBBB", "BBBBGRBBBB", "BBBGBBRBBB", "BBGBBBBBGB", "BGGGGGGGGR", "BBBBBBBBRR" }
Returns: 106