Problem Statement
Suppose a particular standard node is adjacent to d nodes (upward, downward, leftward, or rightward with no wrap-around), and has at least d tokens. Then that node can send 1 token to each adjacent node leaving it with d fewer tokens. For example, a node in the corner with at least 2 tokens could send. Token consumers accept tokens but never send them. finish, which is formatted like setup but with the '_' character replaced by a number, should describe the state of the network after all possible tokens have been sent, and no more can be sent. Return the smallest possible nonnegative value of the unknown, or -1 if no value will work. If finish does not describe a network where tokens cannot be sent (a standard node has too many tokens), also return -1.
Definition
- Class:
- TokenGrid
- Method:
- getUnknown
- Parameters:
- String[], String[]
- Returns:
- int
- Method signature:
- int getUnknown(String[] setup, String[] finish)
- (be sure your method is public)
Notes
- The order in which nodes send their tokens is irrelevant.
Constraints
- setup and finish will be formatted as described in the problem statement.
- setup will contain between 2 and 4 elements inclusive.
- setup and finish will agree on the placement of consumer nodes.
- setup and finish will contain the same number of elements.
- Each integer in setup and finish will be between 0 and 50 inclusive.
- setup will contain at least 1 consumer node.
Examples
{"X X", "X _"}
{"X X", "X 0"}
Returns: 0
0 works quite easily.
{"X X", "X _"}
{"X X", "X 1"}
Returns: 1
{"X X", "X _"}
{"X X", "X 2"}
Returns: -1
The lower right node in finish can send its tokens, so we immediately return -1.
{"X 1", "X _"}
{"X 1", "X 1"}
Returns: 1
{"X 2", "X _"}
{"X 1", "X 0"}
Returns: 1
If the unknown node begins with 1 token, the following sequence of scenarios occurs: X 2 ---> X 0 ---> X 1 X 1 X 2 X 0
{"9 9 9 9", "9 9 9 9", "9 9 9 9", "_ 9 9 X"}
{"1 1 1 1", "1 1 1 1", "1 2 2 1", "1 1 1 X"}
Returns: -1
{"0 0 0 0", "0 0 0 0", "0 0 0 0", "_ 0 0 X"}
{"1 1 1 1", "1 1 1 1", "1 2 2 1", "1 1 1 X"}
Returns: -1
{"0 0 0 0", "0 0 0 0", "0 0 0 0", "_ 0 0 X"}
{"1 1 0 1", "2 2 2 1", "2 3 3 2", "0 1 1 X"}
Returns: 26
{"X 0 0 0", "0 0 0 0", "0 0 0 0", "_ 0 0 X"}
{"X 1 0 1", "2 2 2 1", "2 3 3 2", "0 1 1 X"}
Returns: -1
{ "X 0 0 0", "X _ X 0", "0 X X 0", "0 0 0 0" }
{ "X 1 1 1", "X 1 X 1", "0 X X 1", "1 1 1 1" }
Returns: 4929
{ "X 0 0 0", "X _ X 0", "1 X X 0", "0 0 0 0" }
{ "X 1 1 1", "X 1 X 1", "0 X X 1", "1 1 1 1" }
Returns: 11294
{ "0 0 0 0", "0 0 0 0", "1 0 X 0", "0 0 _ X" }
{ "0 2 1 1", "2 3 3 1", "2 1 X 2", "1 2 0 X" }
Returns: 21873
{"X 0 1 X","1 0 0 1","1 0 1 X","0 _ 0 0"}
{"X 1 2 X","1 3 2 0","2 2 3 X","1 2 1 0"}
Returns: 152338
{"_ X", "20 17"}
{"0 X", "0 1"}
Returns: -1
{"_ 32 X X", "X 44 9 39", "11 16 12 40", "X X 42 X"}
{"0 1 X X", "X 3 3 0", "2 3 3 1", "X X 0 X"}
Returns: 36401
{"X _ 40 13", "X 29 2 47", "X 4 17 27", "X 8 21 X"}
{"X 2 1 0", "X 1 2 2", "X 3 3 2", "X 1 0 X"}
Returns: 24230
{"X 14 48 2", "_ 35 21 X", "X X 29 26", "10 31 4 X" }
{"X 1 1 0", "1 3 3 X", "X X 1 0", "0 2 2 X"}
Returns: 36466
{"X _ 7 X", "6 X 3 5", "6 0 7 X", "X X 10 X"}
{"X 0 2 X", "0 X 0 1", "2 0 3 X", "X X 0 X"}
Returns: 14292
{"_ X X 10", "6 X 7 9", "7 4 1 1", "X 7 8 X"}
{"0 X X 1", "1 X 3 2", "2 0 2 0", "X 1 2 X"}
Returns: 33780
{"X 6 1 X", "_ 3 10 5", "X 5 8 7", "X 3 X X"}
{"X 2 1 X", "1 0 2 1", "X 3 0 2", "X 1 X X"}
Returns: 48533
{"X _ 8 X", "4 X 1 2", "8 X X 5", "6 6 0 7"}
{"X 1 1 X", "1 X 3 1", "0 X X 2", "1 1 2 0"}
Returns: 16040
{"_ 6 10", "8 4 X", "X 9 2"}
{"0 2 0", "2 3 X", "X 1 1"}
Returns: 226
{"0 _ X", "X 8 3", "6 3 X"}
{"1 2 X", "X 0 1", "0 2 X"}
Returns: 199
{"_ 9 3 1", "X 4 5 X", "2 X 9 3", "8 7 7 X"}
{"0 1 2 0", "X 2 3 X", "1 X 3 2", "1 2 0 X"}
Returns: 48784
{"5 _ 8 X", "5 X 9 7", "5 6 4 3", "0 8 0 X"}
{"2 0 1 X", "1 X 2 3", "2 1 1 2", "2 2 1 X"}
Returns: -1
{"8 2 1 4", "_ 10 2 X", "9 1 4 2", "X 5 4 X"}
{"1 0 3 0", "1 2 1 X", "3 4 3 2", "X 0 0 X"}
Returns: -1
{"_ 10 10 X", "X 7 6 5", "8 X 5 5", "5 1 9 7"}
{"1 3 3 X", "X 2 3 2", "2 X 2 1", "0 2 1 2"}
Returns: -1
{"X 0 10 1", "8 _ 2 X", "4 5 9 5", "X 8 X 10"}
{"X 0 3 2", "2 2 1 X", "3 2 1 3", "X 2 X 2"}
Returns: -1
{"0 1 5 8", "X _ 5 3", "10 4 5 6", "X 9 5 X"}
{"1 2 0 2", "X 3 1 2", "2 1 4 2", "X 1 0 X"}
Returns: -1
{"X _ X 9", "0 0 0 3", "8 6 7 10", "X 6 10 8"}
{"X 0 X 2", "0 1 1 3", "0 2 0 1", "X 0 2 2"}
Returns: -1
{"X _ 5 X", "9 0 10 X", "0 X 6 1", "X 8 0 X"}
{"X 1 2 X", "2 1 0 X", "2 X 3 1", "X 2 1 X"}
Returns: 29567
{"_ X 4 5", "1 10 6 5", "8 X 0 2", "X 10 10 X"}
{"0 X 3 0", "3 1 4 3", "1 X 4 2", "X 3 2 X"}
Returns: -1
{"7 _ 9 X", "4 1 8 4", "X 1 4 X", "1 10 10 X"}
{"1 1 1 X", "2 2 0 0", "X 3 0 X", "1 1 2 X"}
Returns: -1
{"X 2 X 9", "0 _ 8 5", "5 9 5 6", "X 8 1 3"}
{"X 1 X 1", "1 1 0 0", "0 2 1 0", "X 2 1 1"}
Returns: -1
{"_ 4 X X", "X 9 0 10", "7 9 2 X", "8 X 1 1"}
{"1 2 X X", "X 3 2 1", "1 0 3 X", "1 X 1 0"}
Returns: 41291
{"8 3 0 X", "6 _ X 1", "6 3 6 9", "10 X 3 6"}
{"0 2 0 X", "2 2 X 1", "0 2 3 2", "1 X 2 0"}
Returns: 79255
{"X _ 1 X", "7 5 X 10", "9 10 10 1", "X 7 9 X"}
{"X 2 0 X", "0 1 X 1", "1 3 3 0", "X 2 0 X"}
Returns: 101042
{"X 0 X 0", "_ 3 2 2", "2 1 0 X", "X 2 2 0"}
{"X 2 X 1", "1 2 1 0", "2 2 1 X", "X 2 2 1"}
Returns: 121849
{"X _ 2 X", "2 2 2 1", "2 0 X 2", "0 1 1 1"}
{"X 1 2 X", "2 3 1 2", "2 1 X 1", "1 0 1 1"}
Returns: 117148
{"_ X 0 0", "X 0 0 0", "0 0 0 0", "0 0 0 0"}
{"0 X 0 0", "X 1 0 0", "0 0 0 0", "0 0 0 0"}
Returns: -1
{"_ 0 0", "0 X 2", "1 X 1"}
{"1 2 1", "0 X 1", "1 X 1"}
Returns: 114
{"_ 0 0", "0 X 2", "1 X 1"}
{"2 2 1", "0 X 1", "1 X 1"}
Returns: -1
{"_ 0 0", "X X 2", "1 X 1"}
{"1 2 1", "X X 1", "1 X 1"}
Returns: 32
{"_ X 0 0", "0 2 1 X", "0 X X 0", "0 0 0 1"}
{"0 X 1 0", "2 3 2 X", "2 X X 2", "1 2 2 1"}
Returns: 28961
{"0 _", "0 X"}
{"1 1", "1 X"}
Returns: 6
{"X _ 0", "1 X 0", "0 0 0"}
{"X 0 1", "0 X 2", "1 2 1"}
Returns: 205
{"_ X 1", "2 X 0", "0 0 1"}
{"1 X 0", "0 X 2", "1 2 1"}
Returns: 119
{"50 50 50 X", "X 50 50 50", "50 50 50 50", "X 50 50 _" }
{"1 1 2 X", "X 1 3 2", "2 2 2 2", "X 2 2 1" }
Returns: 563
Big inputs.
{"50 50 50 X", "X 50 50 50", "50 50 50 50", "X 50 50 _" }
{"1 50 2 X", "X 1 3 2", "32 2 2 2", "X 2 42 1" }
Returns: -1
{"X 0 0 0", "0 _ 2 X", "X X 2 2", "0 0 2 X"}
{"X 1 1 1", "1 3 3 X", "X X 3 0", "1 2 2 X"}
Returns: 46378
{"0 1 0 1", "1 _ 3 X", "1 2 2 2", "X 1 2 X"}
{"1 2 2 0", "0 3 2 X", "1 2 2 2", "X 1 2 X"}
Returns: 152328
{"X 2 1 1", "_ 1 2 1", "1 2 X 2", "X 1 0 0"}
{"X 2 1 0", "2 3 1 2", "0 3 X 2", "X 2 2 1"}
Returns: 131581
{"0 0 0 0", "0 X X 0", "X _ X 0", "X 0 0 0" }
{"1 2 2 1", "2 X X 2", "X 3 X 2", "X 2 2 1" }
Returns: 15906
{"0 0 0 0", "0 X X 0", "X X X 0", "_ 0 0 0" }
{"1 2 2 1", "2 X X 2", "X X X 2", "1 2 2 1" }
Returns: 7100
{"50 50 50 X", "X 50 50 50", "50 50 X 50", "X 50 50 _" }
{"1 1 2 X", "X 1 3 2", "2 2 X 2", "X 2 2 1" }
Returns: 5063
{"2 X", "X _" }
{"1 X", "X 0" }
Returns: -1
{"50 50 50 X", "X 50 50 50", "50 50 50 48", "X 50 50 _" }
{"1 1 2 X", "X 1 3 2", "2 2 2 2", "X 2 2 1" }
Returns: 26259
{"2 X 0", "X X 0", "X X _" }
{"1 X 0", "X X 0", "X X 0" }
Returns: -1
{"50 50 50 X", "X X 50 49", "50 50 50 50", "X 50 50 _" }
{"1 2 2 X", "X X 3 1", "0 1 3 2", "X 1 2 0" }
Returns: 5000
{"X X X X", "X X X X", "X X X X", "_ 9 0 0" }
{"X X X X", "X X X X", "X X X X", "0 2 0 1" }
Returns: 20
{"X 50 50 50", "50 50 50 50", "50 50 50 50", "50 50 50 _" }
{"X 0 0 0", "0 0 0 0", "0 0 0 0", "0 0 0 0" }
Returns: -1
{"X _ X", "6 6 X", "X X X" }
{"X 0 X", "2 2 X", "X X X" }
Returns: 4
{"50 50 50 X", "X 50 50 50", "50 50 50 50", "X 50 50 _" }
{"1 1 2 X", "X 1 1 2", "2 2 2 2", "X 2 2 1" }
Returns: 22461
{"50 50 X X", "X 50 50 50", "50 50 X 50", "X 50 50 _" }
{"1 1 X X", "X 1 3 2", "2 2 X 2", "X 2 2 1" }
Returns: 9382