Problem Statement
We have a rectangular chessboard. Some rooks are already placed onto the chessboard. A pair of rooks is called friendly if the rooks share the same row or column. (Note that there can be other rooks between them in the same row/column.)
A chessboard is called pretty if it is possible to divide all rooks on the chessboard into disjoint friendly pairs. A chessboard is called uniquely pretty if it is pretty and there is exactly one way to form those disjoint friendly pairs.
You are given aDefinition
- Class:
- Permatch
- Method:
- complete
- Parameters:
- String[]
- Returns:
- int
- Method signature:
- int complete(String[] board)
- (be sure your method is public)
Constraints
- n and m will be between 1 and 10, inclusive.
- board will contain exactly n elements.
- Each elements in board will contain exactly m characters.
- Each character in board will be either '#' or '.'.
Examples
{"##"}
Returns: 0
{"#."}
Returns: 1
{"###", ".#."}
Returns: 0
{"###", "..."}
Returns: 1
We can add one rook onto any of the empty cells. The resulting chessboard will always be uniquely pretty. (The new rook has to form a pair with the one above it, and then the remaining two rooks have to form the other pair.)
{"#..##", "###.."}
Returns: 0
{".#..##", "####..", "#....."}
Returns: 0
Here is the only way of dividing these rooks into friendly pairs: . C . . AA DCBB . . D . . . . .
{".#..##", "#.##..", "......"}
Returns: 2
One optimal solution is to create the uniquely pretty chessboard shown in the previous example.
{"##", "##"}
Returns: -1
This chessboard is pretty, but it is not uniquely pretty: there are two ways to partition the rooks. As there are no empty cells, there is no way to add any more rooks.
{"##########", "..........", "..........", "..........", "..........", "..........", "..........", "..........", "..........", ".........."}
Returns: 8
{"#........","........#",".........","..#......",".....#...",".........",".#.......",".......#.",".........","...#....."}
Returns: 7
{".........","...#.....","..#......",".#..#.#..",".....#...","........#",".........",".......#.","#........"}
Returns: 7
{"......#...",".....#....","..........","#.....#...","........##","...#......",".......#..",".........#","....#.....",".#........"}
Returns: 7
{"..........",".......#..","..#.......",".#........","....#.....",".......#..",".......#..","#.........",".......#..",".........#"}
Returns: 7
{".#......","..#.....","......#.","........","#.......","...#....","....#...",".....#..","........","........"}
Returns: 7
{".........",".......#.","....#....",".....#...","......#..","........#",".........","...#.....","#........",".##......"}
Returns: 7
{"..........",".......#..",".#.....#..","..#.......","...#...#..","#.........","........#.",".........#","......#...",".....#...."}
Returns: 7
{"....#.....",".#.......#","#.........","..#.......","..........","........#.",".....#....",".#.....#..","......#...","...#......"}
Returns: 7
{".......#","......#.","..#.....","....#...",".#......","........","...#....",".....#..","........"}
Returns: 7
{"..#.....","......#.","...#....",".....#..","....#...",".......#","#.......","........"}
Returns: 7
{"..#.......","........#.","......#...",".......#..",".........#",".#....#...","#.........","...#......"}
Returns: 7
{"#......","......#","....#..","....#..","....#..","....#..",".#.....",".......","...#...","....#.."}
Returns: 7
{"....#....",".....#..#",".........",".....#...",".......#.","#........","...#.....","......#..",".#......."}
Returns: 7
{"....#.....","........#.","...#......","..........",".......#..","..........",".....#....","#.........","......#...",".........."}
Returns: 7
{"..........","#.........","...#......",".......#..",".........#","......#...","....#.....",".#........",".........."}
Returns: 7
{"........#",".#.......","......#..","#........","...#.....","....#.#..",".......#.",".........",".........","..#......"}
Returns: 7
{"........#",".#.......","...#.....","#........",".........",".....#...","..#......",".........",".........",".......#."}
Returns: 7
{".#.....",".....#.","#......","......#","....#..",".......",".......","..#....","...#..."}
Returns: 7
{"..#.......","#.........",".......#..","..........","..........","....#.....","...#.#....",".........#",".#........","...#......"}
Returns: 7
{"...#......",".........#",".......#..","...#....#.",".....#....","..........","#.........","..#.......","..........","......#..."}
Returns: 7
{"....#....","..#......",".#.......","........#",".......#.",".........","...#.....","......#..","........."}
Returns: 7
{"....#.....",".#........","......#...",".........#",".....#....","#.......#.",".......#..","..#......."}
Returns: 7
{"#........",".....#...","..#......","....#....",".........",".#.......","......#..",".........","...#....."}
Returns: 7
{".....##.","..#.....",".......#",".......#","...#.#..","....#...","..#.....","....#..."}
Returns: 0
{"....##..","....#...","##.....#","..#..#..",".......#","#.....#.","......#.",".....#.#"}
Returns: 0
{".#..##..","........","..#.....","..##.#..","#...#...","#.......","........","........"}
Returns: 0
{"......##",".#...#..",".#....#.",".......#","........","......#.","#......#",".#.#...."}
Returns: 0
{".#........",".###....#.","#.........","........#.","..........","....#....#","#.#.......","...##.....","#........."}
Returns: 0
{"......#.",".#......","....#...","....#..#","#.......","........","##.....#","..#.#.#."}
Returns: 0
{"#..##...","........","##......",".......#","......#.","..#..#..","#.#...##","....#..."}
Returns: 0
{"#..#.###",".#......",".....#..","##......","......#.","...#....",".#......","....#.#."}
Returns: 0
{".......#","........","##......","........",".#..#...","#.#....#",".......#","....#..."}
Returns: 0
{"#.##.....",".#..#....","...#..#..","#.......#",".........","....##.#.",".#.......","........#","..#.#...."}
Returns: 0
{".....###","..#.....",".....#..",".#.....#",".#..#...","#..#....","......#.","..#..#.."}
Returns: 0
{"..#....#.",".........",".#..#..#.",".#.#.#...","..#......",".#.......","....#...#","......#.#"}
Returns: 0
{".....#..","....##.#","..#...#.","###.#...","....#...","........","......#.","........"}
Returns: 0
{"..#.....","......#.",".....##.","###..#..","..#.#...","#.......","...#.#.#","....#...",".#......"}
Returns: 0
{"......##","#.....#.",".......#",".....#..","..#.##..",".#.#..#.",".#......",".......#"}
Returns: 0
{"..........",".....#..#.","....#...#.","..#...#...","#.#..#....",".#.....##.","....#....#",".........#",".......#.."}
Returns: 0
{"..#......","...#.....","#......#.","#..#.....","#....#...","..#.....#",".#.#....#","#........"}
Returns: 0
{"##......","#....#..","....##..","..#.....",".#......","........","..##....","........",".#.#...."}
Returns: 0
{"....##....",".#......##","#..#...#..","...##.....",".#....#...","#.........","..........","........#."}
Returns: 0
{"...#......",".........#","..........",".........#","..#....#..","....#.....",".......##.","...##..#..",".#.#.....#"}
Returns: 0
{".....#.#.#","#...#.....","...#......","#.#...#...","#.........","......#..#","#..#....#.",".......#.."}
Returns: 0
{"#...#.....","#........#","...###....",".....#....",".#.#......",".....##...","....#...#.","#.#......."}
Returns: 0
{"##....#..",".......#.",".#......#","..#..#...","..#......",".....#.#.",".#..#..#.",".....#...","........#"}
Returns: 0
{"#.......",".....#..","....##..","#..#...#","..##....","........","........","....#..."}
Returns: 0
{".#......","..#.....","..#...#.","#....#..",".#......",".#.....#","#......#","......##","...###.."}
Returns: 0
{"..#......",".....#...","........#","...#.....",".......#.","#..#....#","..#.....#","#........","..#...##.",".....##.."}
Returns: 0
{"........",".##.....","#.....#.","#...##..","........",".#..#...","........","..##...#"}
Returns: 0
{"..#.#...","#.#.....","..#....#","........","....#...","...##...",".#..#...",".#......"}
Returns: 0
{".....#..#","..#...#..","#........","...##....",".#...##..","..#.#....","#.......#","........."}
Returns: 0
{"##.......","..#...#..","#...#....","..#......","........#",".#.....#.",".#.......","..#....##","........#","#........"}
Returns: 0
{"#..#....","........","#...#...","......##",".###....",".......#","....#...","....#...","........",".#....#."}
Returns: 0
{"##....#.","....#...","....#...","..#..#.#","#.......","....#..#",".....#..","#..#...#","...#...."}
Returns: 0
{"...#.#...","....#....","#........","..#.....#","#........","......##.","...#..#..","#...#...#"}
Returns: 0
{"#....#.#",".#......",".......#","..#...#.",".#.....#","....#.#.","...#....","..##.#..","......#."}
Returns: 0
{".......#.","........#","..#..#...","##.......",".....#...","...#..#..",".....#.##","...##...."}
Returns: 0
{"......#.",".##.....","..#....#",".#......","...#.#.#",".......#","#.....#.","......#.","#.#.#..."}
Returns: 0
{"...#..##","........","..#.#...","#.......",".##..#..","........","#...#...",".......#"}
Returns: 0
{".#.....#","...#.#..",".....#..","#.#....#","#...#...","..##....",".....#..","#......."}
Returns: 0
{"........","...#...#","...#..#.",".....##.",".......#",".#.##...","..#.....","..#....."}
Returns: 0
{".....#..","........","#...#.#.","..##....",".#..#...",".....#..",".#......","..#...#.","..#....#"}
Returns: 0
{".....#....","..#.......",".#........",".#....#...","..........","...#......","#.........","....#.....","..........",".......#.."}
Returns: 7
{"........#.","#.........","........#.","......#...","..#.......",".......#..","..........","...#......","....#.....","........#."}
Returns: 7
{"...#......","......#...","#.........",".......#..","..........",".....#....","....#.....",".........#"}
Returns: 7
{".......#..","..........",".....#....","....#.....","#.........","........#.","......#...","...#......"}
Returns: 7
{".....#...","#........",".....#...","....#....",".#.......",".....#...","........#","......#..","...#....."}
Returns: 7
{".......#..","..........",".#........","......#...","..........",".........#","..#.......","........#.",".....#..#.","#........."}
Returns: 7
{"#.........",".........#","......#...","..........","..........","...#......",".#........",".....#....","..#......."}
Returns: 7
{"...#......",".....#....","..#.......",".#........",".......#..","......#...","..........","........#.",".........."}
Returns: 7
{"....#.....",".....#....","......#...","..#.......","...#......","#....#....","..........",".#........",".......#.."}
Returns: 7
{"...#......","........#.","......#...",".........#",".#........",".....#....","....#.....",".......#.."}
Returns: 8
{"..........","..........","...#..#...","..........","........#.","........#.","#.......#."}
Returns: 0
{"..........","..........","...##.....","..........","..........","..........","..#.......","..........",".....#...."}
Returns: 2
{"......","......","......","......","......","......",".....#"}
Returns: 1
{"........","#.......","........","........","........","........"}
Returns: 1
{"...#....","....#...","........","#..#.#..","......##","....#.#.","#.#....."}
Returns: 1
{"......#.","..#....#",".#.#....","#..#.#..","#.......","........","......#.","........","........"}
Returns: 0
{"......","....#.","...#..","......","...#..","......","......","......","......"}
Returns: 1
{"......",".#.#..","..#...","..#.#.",".#....",".....#","......","#.#...","......"}
Returns: 3
{".....#....",".........#","#....#....","..........","..........",".#..#.....",".#.......#","..#.......",".........."}
Returns: 3
{"..#..###.","#........",".........",".........",".........",".........",".........","..#......"}
Returns: 2
{"........","........","..#...#.",".#......","........","........","........","........"}
Returns: 1
{".#.#.#..",".......#","#....#..","........","...#....","........"}
Returns: 1
{"......##","....#...","........",".....#..","........",".#......"}
Returns: 3
{".......",".......",".......",".......",".......","......."}
Returns: 0
{"........","......#.","...##...","....#...","........","..##....","........"}
Returns: 2
{".......#..","..........",".....#....","..........",".#........",".........#","..........","....#.....",".........."}
Returns: 5
{"......","......","......","......","......","......","......"}
Returns: 0
{"...#..","......","......","..#..#","......","......","......","..##..","......","......"}
Returns: 1
{"..#...","......","#.....","......","......","...#..","......"}
Returns: 3
{"#......","....##.",".#....#","....#..","#......",".....#.","#.....#",".......",".......",".#...#."}
Returns: 0
{"..........",".##.......","..........",".#..#.....","........#.","#.........","..#....#.."}
Returns: 2
{"........","........","......#.","........","....#.#.","..#.....","........",".....#.#",".......#","........"}
Returns: 3
{".......#","....#...",".#......","........","........","..#....."}
Returns: 4
{"..#.#.....",".........#","........#.","...#..##..","..........","....###.#.","#.........",".........."}
Returns: 2
{"..........","..........","..........","#.........",".......#..","......#...","....#.....","....#...#.","..........",".........."}
Returns: 4
{"......#...","..........","..........","........#.","...#......",".......#..","..........","..........","..........","#......#.."}
Returns: 4
{"..........","..........","..........","..........",".......#..","..........",".........#",".........#","..........",".........."}
Returns: 1
{"...#......","..........",".......##.","..........","#.....#...","#.........",".#........"}
Returns: 3
{"......","....#.","......","......","......","......"}
Returns: 1
{".........",".........",".........","........#",".........","..#.....#",".........","....#...."}
Returns: 2
{"##","##","##","##"}
Returns: -1
{".#.#.",".#..#",".##.#","##..#",".###."}
Returns: -1
{"........#.",".###..#.##","...#.#....",".##..#####",".#....#..#","..#..#.#.#"}
Returns: -1
{"..#..#.#",".##..#.#","#..##.#.","#.###...","########","#######."}
Returns: -1
{"..","..","#.","#.","##","##"}
Returns: -1
{"....","..##","..#.","....","..##","#..."}
Returns: -1
{"#"}
Returns: -1
{".#.#.#.#","#...#.#.",".###....","..##..#.","###.###."}
Returns: -1
{"#","#","#","#","#","#","#","#","#","#"}
Returns: -1
{"##########","..########","###.######","##########","###.#####."}
Returns: -1
{"#..#####","########","########","########","#..#####","#######.","########","#######.",".####.##"}
Returns: -1
{"###.####","#.#...##",".##....#","##.##.##","####.#..","######.#","##.####.","##.#####"}
Returns: -1
{"###.....","#..###..",".#.##.##","#.#.....","..###.#."}
Returns: -1
{"######","######",".#####","##.##."}
Returns: -1
{"#..#....##","###......#","#...#...##"}
Returns: -1
{"."}
Returns: 0
{"###", "###", "###"}
Returns: -1
{"#","#","#","."}
Returns: -1
{"#"}
Returns: -1
{"####.", "#...."}
Returns: -1
{"#####", "....."}
Returns: -1
{"#.","##","#.","#.",".."}
Returns: -1
{".#.","..#",".#.","###",".#.","..."}
Returns: -1
{"##...","....#",".....",".....","....#","..##.","#.#.#","....#"}
Returns: -1
{"##########", "..........", "..........", "..........", "..........", "..........", "..........", "..........", "..........", ".........." }
Returns: 8